#15517 closed (fixed)
Admin search_field prefixes conflict with db.models.get_field_by_name
| Reported by: | Fabian Büchler | Owned by: | nobody |
|---|---|---|---|
| Component: | contrib.admin | Version: | 1.3-beta |
| Severity: | Keywords: | blocker, search_fields, changelist | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
This issue might be related to #15203 and to the changeset r3601.
In the Django admin, the ModelAdmin.search_fields prefixes (^, =, @) are converted to __istartswith, __iexact and __search respectively in line 258 in django.contrib.admin.views.main:
or_queries = [models.Q(**{construct_search(str(field_name)): bit}) for field_name in self.search_fields]
A few lines below in line 263 the field names are passed to django.db.models.options.Options.get_field_by_name without stripping the search prefixes first:
f = self.lookup_opts.get_field_by_name(field_name)[0]
This results in FieldNotFound errors like "Event has no field named '=slug'".
I've attached a working patch.
Attachments (2)
Change History (7)
by , 15 years ago
| Attachment: | patch_modeladmin_search_fields.diff added |
|---|
comment:1 by , 15 years ago
| Keywords: | blocker added |
|---|---|
| Needs tests: | set |
| Triage Stage: | Unreviewed → Accepted |
by , 15 years ago
| Attachment: | 15517_search_fields_regression.diff added |
|---|
comment:2 by , 15 years ago
| Needs tests: | unset |
|---|
Your patch looks good. I've added tests for beginning ('^...') and exact ('=...') matches. Bizarrely I couldn't find any existing tests for these or for full-text matches ('@...') in the existing test suite.
Thanks for the report. This is a regression introduced in [15526]. I'll post some tests shortly.