#17972 closed Bug (fixed)
regression: admin list_filter does not work with to_field
Reported by: | Karen Tracey | Owned by: | Julien Phalip |
---|---|---|---|
Component: | contrib.admin | Version: | dev |
Severity: | Release blocker | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
This is #9994 exactly, recently reported as having re-appeared. Opening a new ticket rather than re-opening a 3-year-old fixed ticket. Given these models:
class Department(models.Model): code = models.CharField(max_length=4, unique=True) description = models.CharField(max_length=50, blank=True, null=True) class Employee(models.Model): department = models.ForeignKey(Department, to_field="code") name = models.CharField(max_length=100)
And this admin definition:
class EmployeeAdmin(admin.ModelAdmin): list_display = ['name', 'department'] list_filter = ['department']
Create a couple of departments (more than 1 needed to make the list filter show up), and an employee. Then on the employee list page, attempting to filter by a department fetches a url like:
http://localhost:8000/admin/ttt/employee/?department__id__exact=FINC
which results in an exception:
Environment: Request Method: GET Request URL: http://localhost:8000/admin/ttt/employee/?department__id__exact=FINC Django Version: 1.4 Python Version: 2.7.2 Installed Applications: ('django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'ttt') Installed Middleware: ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'ttt.middleware.TestMiddleware') Traceback: File "C:\Users\kmtracey\django\trunk\django\core\handlers\base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs) File "C:\Users\kmtracey\django\trunk\django\contrib\admin\options.py" in wrapper 366. return self.admin_site.admin_view(view)(*args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\utils\decorators.py" in _wrapped_view 91. response = view_func(request, *args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\views\decorators\cache.py" in _wrapped_view_func 89. response = view_func(request, *args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\contrib\admin\sites.py" in inner 196. return view(request, *args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\utils\decorators.py" in _wrapper 25. return bound_func(*args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\utils\decorators.py" in _wrapped_view 91. response = view_func(request, *args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\utils\decorators.py" in bound_func 21. return func(self, *args2, **kwargs2) File "C:\Users\kmtracey\django\trunk\django\contrib\admin\options.py" in changelist_view 1128. self) File "C:\Users\kmtracey\django\trunk\django\contrib\admin\views\main.py" in __init__ 71. self.query_set = self.get_query_set(request) File "C:\Users\kmtracey\django\trunk\django\contrib\admin\views\main.py" in get_query_set 306. new_qs = filter_spec.queryset(request, qs) File "C:\Users\kmtracey\django\trunk\django\contrib\admin\filters.py" in queryset 132. return queryset.filter(**self.used_parameters) File "C:\Users\kmtracey\django\trunk\django\db\models\query.py" in filter 621. return self._filter_or_exclude(False, *args, **kwargs) File "C:\Users\kmtracey\django\trunk\django\db\models\query.py" in _filter_or_exclude 639. clone.query.add_q(Q(*args, **kwargs)) File "C:\Users\kmtracey\django\trunk\django\db\models\sql\query.py" in add_q 1250. can_reuse=used_aliases, force_having=force_having) File "C:\Users\kmtracey\django\trunk\django\db\models\sql\query.py" in add_filter 1185. connector) File "C:\Users\kmtracey\django\trunk\django\db\models\sql\where.py" in add 69. value = obj.prepare(lookup_type, value) File "C:\Users\kmtracey\django\trunk\django\db\models\sql\where.py" in prepare 320. return self.field.get_prep_lookup(lookup_type, value) File "C:\Users\kmtracey\django\trunk\django\db\models\fields\__init__.py" in get_prep_lookup 310. return self.get_prep_value(value) File "C:\Users\kmtracey\django\trunk\django\db\models\fields\__init__.py" in get_prep_value 537. return int(value) Exception Type: ValueError at /admin/ttt/employee/ Exception Value: invalid literal for int() with base 10: 'FINC'
#9994 had been fixed, unfortunately without tests. The above scenario works at r14673. The filtered URL differs from above, it is:
http://localhost:8000/admin/ttt/employee/?department__code__exact=FINC
This correctly filters by department. r14674 introduces a regression, the list filter link href goes back to:
http://localhost:8000/admin/ttt/employee/?department__id__exact=FINC
Attempting to follow that link redirects to:
http://localhost:8000/admin/ttt/employee/?e=1
So something subsequent to r14674 (which I have not tracked down) removes the admin's "I'm confused error" redirect and as a result we now get a server error for this case.
Furthermore attempting to manually "correct" the url to the version that would work results in:
Exception Type: SuspiciousOperation at /admin/ttt/employee/ Exception Value: Filtering by department__code__exact not allowed
So there may be more to fixing this than getting the list filter to generate the old url that did work.
Attachments (2)
Change History (7)
comment:1 by , 13 years ago
Owner: | changed from | to
---|---|
Triage Stage: | Unreviewed → Accepted |
by , 13 years ago
Attachment: | 17972.listfilter-fk-with-tofield.diff added |
---|
comment:2 by , 13 years ago
Severity: | Normal → Release blocker |
---|
The attached patch fixes the problem in trunk. The same fix would need to be applied to the 1.3.X branch as the regression was initially introduced in 1.3. I'll wait till we decide the new branch policy before pushing those fixes.
by , 13 years ago
Attachment: | 17972.listfilter-fk-with-tofield.1-3-X.diff added |
---|
Same patch for the 1.3.X branch
Thanks for the detailed report, Karen. I'm working on a patch.