Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.7.x] Fixed #22994 -- regression with generic FK + admin list_view

The reason for the regression was that the GenericForeignKey field isn't
something meta.get_field_by_name() should return. The reason is that a
couple of places in Django expects get_field_by_name() to work this way.
It could make sense to return GFKs from get_field_by_name(), but that
should likely be done as part of meta refactoring or virtual fields
refactoring patches.

Thanks to glicerinu@gmail.com for the report and to Tim for working on
the issue.
  • Loading branch information...
commit 572885729e028eae2f2b823ef87543b7c66bdb10 1 parent 1d1debe
@akaariai akaariai authored timgraham committed
View
4 django/db/models/options.py
@@ -451,7 +451,9 @@ def init_name_map(self):
for f, model in self.get_fields_with_model():
cache[f.name] = cache[f.attname] = (f, model, True, False)
for f in self.virtual_fields:
- cache[f.name] = (f, None if f.model == self.model else f.model, True, False)
+ if hasattr(f, 'related'):
+ cache[f.name] = cache[f.attname] = (
+ f, None if f.model == self.model else f.model, True, False)
if apps.ready:
self._name_map = cache
return cache
View
7 tests/admin_views/admin.py
@@ -35,7 +35,7 @@
UnchangeableObject, UserMessenger, Simple, Choice, ShortMessage, Telegram,
FilteredManager, EmptyModelHidden, EmptyModelVisible, EmptyModelMixin,
State, City, Restaurant, Worker, ParentWithDependentChildren,
- DependentChild, StumpJoke, FieldOverridePost)
+ DependentChild, StumpJoke, FieldOverridePost, FunkyTag)
def callable_year(dt_value):
@@ -821,6 +821,10 @@ def get_changeform_initial_data(self, request):
return {'name': 'overridden_value'}
+class FunkyTagAdmin(admin.ModelAdmin):
+ list_display = ('name', 'content_object')
+
+
site = admin.AdminSite(name="admin")
site.register(Article, ArticleAdmin)
site.register(CustomArticle, CustomArticleAdmin)
@@ -876,6 +880,7 @@ def get_changeform_initial_data(self, request):
site.register(City, CityAdmin)
site.register(Restaurant, RestaurantAdmin)
site.register(Worker, WorkerAdmin)
+site.register(FunkyTag, FunkyTagAdmin)
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
# That way we cover all four cases:
View
17 tests/admin_views/tests.py
@@ -1655,12 +1655,27 @@ def test_generic_relations(self):
"""
plot = Plot.objects.get(pk=3)
FunkyTag.objects.create(content_object=plot, name='hott')
- should_contain = """<li>Funky tag: hott"""
+ should_contain = """<li>Funky tag: <a href="/test_admin/admin/admin_views/funkytag/1/">hott"""
response = self.client.get('/test_admin/admin/admin_views/plot/%s/delete/' % quote(3))
self.assertContains(response, should_contain)
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
+class TestGenericRelations(TestCase):
+ urls = "admin_views.urls"
+ fixtures = ['admin-views-users.xml', 'deleted-objects.xml']
+
+ def setUp(self):
+ self.client.login(username='super', password='secret')
+
+ def test_generic_content_object_in_list_display(self):
+ plot = Plot.objects.get(pk=3)
+ FunkyTag.objects.create(content_object=plot, name='hott')
+ response = self.client.get('/test_admin/admin/admin_views/funkytag/')
+ self.assertContains(response, "%s</td>" % plot)
+
+
+@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
class AdminViewStringPrimaryKeyTest(TestCase):
urls = "admin_views.urls"
fixtures = ['admin-views-users.xml', 'string-primary-key.xml']
Please sign in to comment.
Something went wrong with that request. Please try again.