10000 Fixed #23329 -- Allowed inherited and m2m fields to be referenced in … · alex-python/django@4c96bd8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4c96bd8

Browse files
committed
Fixed #23329 -- Allowed inherited and m2m fields to be referenced in the admin.
Thanks to Trac alias Markush2010 and ross for the detailed reports. Backport of 3cbb759 from master
1 parent 5d647e5 commit 4c96bd8

File tree

7 files changed

+65
-5
lines changed

7 files changed

+65
-5
lines changed

django/contrib/admin/options.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,11 +284,13 @@ def to_field_allowed(self, request, to_field):
284284
return False
285285

286286
# Make sure at least one of the models registered for this site
287-
# references this field.
287+
# references this field through a FK or a M2M relationship.
288288
registered_models = self.admin_site._registry
289-
for related_object in opts.get_all_related_objects():
290-
if (related_object.model in registered_models and
291-
field == related_object.field.rel.get_related_field()):
289+
for related_object in (opts.get_all_related_objects() +
290+
opts.get_all_related_many_to_many_objects()):
291+
related_model = related_object.model
292+
if (any(issubclass(model, related_model) for model in registered_models) and
293+
related_object.field.rel.get_related_field() == field):
292294
return True
293295

294296
return False

docs/releases/1.4.15.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
===========================
2+
Django 1.4.15 release notes
3+
===========================
4+
5+
*Under development*
6+
7+
Django 1.4.15 fixes a regression in the 1.4.14 security release.
8+
9+
Bugfixes
10+
========
11+
12+
* Allowed inherited and m2m fields to be referenced in the admin
13+
(`#22486 <http://code.djangoproject.com/ticket/23329>`_)

docs/releases/1.5.10.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
===========================
2+
Django 1.5.10 release notes
3+
===========================
4+
5+
*Under development*
6+
7+
Django 1.5.10 fixes a regression in the 1.5.9 security release.
8+
9+
Bugfixes
10+
========
11+
12+
* Allowed inherited and m2m fields to be referenced in the admin
13+
(`#22486 <http://code.djangoproject.com/ticket/23329>`_)

docs/releases/index.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ versions of the documentation contain the release notes for any later releases.
2525
.. toctree::
2626
:maxdepth: 1
2727

28+
1.5.10
2829
1.5.9
2930
1.5.8
3031
1.5.7
@@ -41,6 +42,7 @@ versions of the documentation contain the release notes for any later releases.
4142
.. toctree::
4243
:maxdepth: 1
4344

45+
1.4.15
4446
1.4.14
4547
1.4.13
4648
1.4.12

tests/regressiontests/admin_views/admin.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
2929
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
3030
RelatedPrepopulated, UndeletableObject, UserMessenger, Simple, Choice,
31-
ShortMessage, Telegram)
31+
ShortMessage, Telegram, ReferencedByParent, ChildOfReferer, M2MReference)
3232

3333

3434
def callable_year(dt_value):
@@ -703,6 +703,9 @@ class ChoiceList(admin.ModelAdmin):
703703
site.register(MainPrepopulated, MainPrepopulatedAdmin)
704704
site.register(UnorderedObject, UnorderedObjectAdmin)
705705
site.register(UndeletableObject, UndeletableObjectAdmin)
706+
site.register(ReferencedByParent)
707+
site.register(ChildOfReferer)
708+
site.register(M2MReference)
706709

707710
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
708711
# That way we cover all four cases:

tests/regressiontests/admin_views/models.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,3 +678,21 @@ class Simple(models.Model):
678678
class Choice(models.Model):
679679
choice = models.IntegerField(blank=True, null=True,
680680
choices=((1, 'Yes'), (0, 'No'), (None, 'No opinion')))
681+
682+
683+
# Models for #23329
684+
class ReferencedByParent(models.Model):
685+
pass
686+
687+
688+
class ParentWithFK(models.Model):
689+
fk = models.ForeignKey(ReferencedByParent)
690+
691+
692+
class ChildOfReferer(ParentWithFK):
693+
pass
694+
695+
696+
class M2MReference(models.Model):
697+
ref = models.ManyToManyField('self')
698+

tests/regressiontests/admin_views/tests.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,15 @@ def test_disallowed_to_field(self):
571571
response = self.client.get("/test_admin/admin/admin_views/section/", {TO_FIELD_VAR: 'id'})
572572
self.assertEqual(response.status_code, 200)
573573

574+
# Specifying a field referenced by another model though a m2m should be allowed.
575+
response = self.client.get("/test_admin/admin/admin_views/m2mreference/", {TO_FIELD_VAR: 'id'})
576+
self.assertEqual(response.status_code, 200)
577+
578+
# Specifying a field that is not refered by any other model directly registered
579+
# to this admin site but registered through inheritance should be allowed.
580+
response = self.client.get("/test_admin/admin/admin_views/referencedbyparent/", {TO_FIELD_VAR: 'id'})
581+
self.assertEqual(response.status_code, 200)
582+
574583
def test_allowed_filtering_15103(self):
575584
"""
576585
Regressions test for ticket 15103 - filtering on fields defined in a

0 commit comments

Comments
 (0)
0