Created
September 4, 2014 21:05
-
-
Save charettes/4d65686bc89f187e53fd to your computer and use it in GitHub Desktop.
to_field inline fix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From a3c6349b2c799bd45c3f250d0c03b81f5b03a91e Mon Sep 17 00:00:00 2001 | |
From: Simon Charette <charette.s@gmail.com> | |
Date: Thu, 4 Sep 2014 17:04:53 -0400 | |
Subject: [PATCH] Inline fix. | |
--- | |
django/contrib/admin/options.py | 10 +++++++++- | |
tests/admin_views/admin.py | 13 ++++++++++++- | |
tests/admin_views/models.py | 12 ++++++++++++ | |
tests/admin_views/tests.py | 5 +++++ | |
4 files changed, 38 insertions(+), 2 deletions(-) | |
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py | |
index 3e774cc..db82c47 100644 | |
--- a/django/contrib/admin/options.py | |
+++ b/django/contrib/admin/options.py | |
@@ -436,6 +436,10 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)): | |
return clean_lookup in valid_lookups | |
def to_field_allowed(self, request, to_field): | |
+ """ | |
+ Returns True if the model associated with this admin should be | |
+ allowed to be referenced by the specified field. | |
+ """ | |
opts = self.model._meta | |
try: | |
@@ -445,7 +449,11 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)): | |
# Make sure at least one of the models registered for this site | |
# references this field through a FK or a M2M relationship. | |
- registered_models = self.admin_site._registry | |
+ registered_models = set() | |
+ for model, admin in self.admin_site._registry.iteritems(): | |
+ registered_models.add(model) | |
+ for inline in admin.inlines: | |
+ registered_models.add(inline.model) | |
for related_object in (opts.get_all_related_objects() + | |
opts.get_all_related_many_to_many_objects()): | |
related_model = related_object.model | |
diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py | |
index 76ced82..077d64b 100644 | |
--- a/tests/admin_views/admin.py | |
+++ b/tests/admin_views/admin.py | |
@@ -36,7 +36,8 @@ from .models import (Article, Chapter, Child, Parent, Picture, Widget, | |
FilteredManager, EmptyModelHidden, EmptyModelVisible, EmptyModelMixin, | |
State, City, Restaurant, Worker, ParentWithDependentChildren, | |
DependentChild, StumpJoke, FieldOverridePost, FunkyTag, | |
- ReferencedByParent, ChildOfReferer, M2MReference) | |
+ ReferencedByParent, ChildOfReferer, M2MReference, ReferencedByInline, | |
+ InlineReference, InlineReferer) | |
def callable_year(dt_value): | |
@@ -832,6 +833,14 @@ class FunkyTagAdmin(admin.ModelAdmin): | |
list_display = ('name', 'content_object') | |
+class InlineReferenceInline(admin.TabularInline): | |
+ model = InlineReference | |
+ | |
+ | |
+class InlineRefererAdmin(admin.ModelAdmin): | |
+ inlines = [InlineReferenceInline] | |
+ | |
+ | |
site = admin.AdminSite(name="admin") | |
site.site_url = '/my-site-url/' | |
site.register(Article, ArticleAdmin) | |
@@ -892,6 +901,8 @@ site.register(FunkyTag, FunkyTagAdmin) | |
site.register(ReferencedByParent) | |
site.register(ChildOfReferer) | |
site.register(M2MReference) | |
+site.register(ReferencedByInline) | |
+site.register(InlineReferer, InlineRefererAdmin) | |
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2. | |
# That way we cover all four cases: | |
diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py | |
index 413201c..f0e2ddd 100644 | |
--- a/tests/admin_views/models.py | |
+++ b/tests/admin_views/models.py | |
@@ -839,3 +839,15 @@ class ChildOfReferer(ParentWithFK): | |
class M2MReference(models.Model): | |
ref = models.ManyToManyField('self') | |
+ | |
+ | |
+class ReferencedByInline(models.Model): | |
+ pass | |
+ | |
+ | |
+class InlineReference(models.Model): | |
+ fk = models.ForeignKey(ReferencedByInline) | |
+ | |
+ | |
+class InlineReferer(models.Model): | |
+ refs = models.ManyToManyField(InlineReference) | |
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py | |
index 9d67bd2..524ef2f 100644 | |
--- a/tests/admin_views/tests.py | |
+++ b/tests/admin_views/tests.py | |
@@ -625,6 +625,11 @@ class AdminViewBasicTest(AdminViewBasicTestCase): | |
response = self.client.get("/test_admin/admin/admin_views/referencedbyparent/", {TO_FIELD_VAR: 'id'}) | |
self.assertEqual(response.status_code, 200) | |
+ # Specifying a field that is only refered to by a inline of a registered | |
+ # model should be allowed. | |
+ response = self.client.get("/test_admin/admin/admin_views/referencedbyinline/", {TO_FIELD_VAR: 'id'}) | |
+ self.assertEqual(response.status_code, 200) | |
+ | |
# We also want to prevent the add and change view from leaking a | |
# disallowed field value. | |
with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls: | |
-- | |
1.9.1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Worked nice but I needed to insert
six.iteritems(self.admin_site._registry)
for python 3 compatibility.