[1.6.x] Fixed #21431 -- GenRel->FK list_filter regression in admin

Report, analysis and tests from stephenmcd.

Backpatch of 752d3d70da from master.
This commit is contained in:
Anssi Kääriäinen 2013-11-21 14:11:57 +02:00
parent 47abfa237e
commit 5730bf2819
2 changed files with 22 additions and 1 deletions

View File

@ -379,7 +379,9 @@ class NotRelationField(Exception):
def get_model_from_relation(field): def get_model_from_relation(field):
if isinstance(field, models.related.RelatedObject): if hasattr(field, 'get_path_info'):
return field.get_path_info()[-1].to_opts.model
elif isinstance(field, models.related.RelatedObject):
return field.model return field.model
elif getattr(field, 'rel'): # or isinstance? elif getattr(field, 'rel'): # or isinstance?
return field.rel.to return field.rel.to

View File

@ -7,6 +7,7 @@ import datetime
from django.conf import settings, global_settings from django.conf import settings, global_settings
from django.core import mail from django.core import mail
from django.core.exceptions import ImproperlyConfigured
from django.core.files import temp as tempfile from django.core.files import temp as tempfile
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
# Register auth models with the admin. # Register auth models with the admin.
@ -16,6 +17,7 @@ from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
from django.contrib.admin.models import LogEntry, DELETION from django.contrib.admin.models import LogEntry, DELETION
from django.contrib.admin.sites import LOGIN_FORM_KEY from django.contrib.admin.sites import LOGIN_FORM_KEY
from django.contrib.admin.util import quote from django.contrib.admin.util import quote
from django.contrib.admin.validation import ModelAdminValidator
from django.contrib.admin.views.main import IS_POPUP_VAR from django.contrib.admin.views.main import IS_POPUP_VAR
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth import REDIRECT_FIELD_NAME
@ -4361,3 +4363,20 @@ class AdminKeepChangeListFiltersTests(TestCase):
class NamespacedAdminKeepChangeListFiltersTests(AdminKeepChangeListFiltersTests): class NamespacedAdminKeepChangeListFiltersTests(AdminKeepChangeListFiltersTests):
admin_site = site2 admin_site = site2
class AdminGenericRelationTests(TestCase):
def test_generic_relation_fk_list_filter(self):
"""
Validates a model with a generic relation to a model with
a foreign key can specify the generic+fk relationship
path as a list_filter. See trac #21428.
"""
class GenericFKAdmin(admin.ModelAdmin):
list_filter = ('tags__content_type',)
validator = ModelAdminValidator()
try:
validator.validate_list_filter(GenericFKAdmin, Plot)
except ImproperlyConfigured:
self.fail("Couldn't validate a GenericRelation -> FK path in ModelAdmin.list_filter")