- February 4, 2010
- 2 (after 2 ratings)
This is some (probably) pretty dodgy code that allows for foreign keys in the admin's list_filter without using a custom FilterSpec. It overrides the django.db.models.options.Options get_field class to handle spanned relationships, i.e. list_filter=('houseroomtown',) as seen in http://code.djangoproject.com/ticket/3400
I have only tested this with a double foreign key relationship('house__room'), and it worked. It hasn't been tested in production, and the troubling part of this code is probably to use of 'deepcopy'. I do add those copies back to the options instance, so there shouldn't be too much runaway copying.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
from django.db.models.fields import FieldDoesNotExist import copy from django.db.models.fields.related import ForeignKey def get_field(self, name, many_to_many=True): """ Returns the requested field by name. Raises FieldDoesNotExist on error. """ to_search = many_to_many and (self.fields + self.many_to_many) or self.fields if hasattr(self, '_copy_fields'): to_search += self._copy_fields for f in to_search: if f.name == name: return f if not name.startswith('__') and '__' in name: f = None model = self path = name.split('__') for field_name in path: f = model._get_field(field_name) if isinstance(f, ForeignKey): model = f.rel.to._meta f = copy.deepcopy(f) f.name = name if not hasattr(self, "_copy_fields"): self._copy_fields = list() self._copy_fields.append(f) return f raise FieldDoesNotExist, '%s has no field named %r' % (self.object_name, name) setattr(options.Options, '_get_field', options.Options.get_field.im_func) setattr(options.Options, 'get_field', get_field)
More like this
- Stuff by NixonDash 1 month ago
- Add custom fields to the built-in Group model by jmoppel 3 months, 1 week ago
- Month / Year SelectDateWidget based on django SelectDateWidget by pierreben 6 months, 3 weeks ago
- Python Django CRUD Example Tutorial by tuts_station 7 months, 1 week ago
- Browser-native date input field by kytta 8 months, 3 weeks ago
I have problems in the setattr. Where i should put that? In my class Model, doesn´t recognize options. Thanks
I put the setattr call in the admin.py for my app.
I think he means that you get the error 'name 'options' is not defined'
Is there a missing 'from django.db.models import options'?
Sorry, yes that import should be there so that options will be recognized
i don't really understand how to use it. who calls get_field?
how i can use it? in admin.py how i can use it as field?
Please login first before commenting.