From a24cf217220dca44b7bd5b36ad9c14a96bca486e Mon Sep 17 00:00:00 2001 From: Emmanuelle Delescolle Date: Sun, 5 Oct 2014 20:06:51 +0200 Subject: [PATCH] Fixed #23604 -- Allowed related m2m fields to be references in the admin. Thanks Simon Charette for review. --- django/contrib/admin/options.py | 5 +++++ docs/releases/1.4.16.txt | 7 +++++-- docs/releases/1.5.11.txt | 5 ++++- docs/releases/1.6.8.txt | 5 ++++- docs/releases/1.7.1.txt | 3 +++ tests/admin_views/admin.py | 3 ++- tests/admin_views/models.py | 10 ++++++++++ tests/admin_views/tests.py | 4 ++++ 8 files changed, 37 insertions(+), 5 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 6edae7a5c5..bf8f2717c2 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -451,6 +451,11 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)): except FieldDoesNotExist: return False + # Check whether this model is the origin of a M2M relationship + # in which case to_field has to be the pk on this model. + if opts.many_to_many and field.primary_key: + return True + # Make sure at least one of the models registered for this site # references this field through a FK or a M2M relationship. registered_models = set() diff --git a/docs/releases/1.4.16.txt b/docs/releases/1.4.16.txt index b10a72d264..23e9ecd380 100644 --- a/docs/releases/1.4.16.txt +++ b/docs/releases/1.4.16.txt @@ -4,12 +4,15 @@ Django 1.4.16 release notes *Under development* -Django 1.4.16 fixes a regression in the 1.4.14 security release and a bug -preventing the use of some GEOS versions with GeoDjango. +Django 1.4.16 fixes a couple regressions in the 1.4.14 security release and a +bug preventing the use of some GEOS versions with GeoDjango. Bugfixes ======== +* Allowed related many-to-many fields to be referenced in the admin + (`#23604 `_). + * Allowed inline and hidden references to admin fields (`#23431 `_). diff --git a/docs/releases/1.5.11.txt b/docs/releases/1.5.11.txt index 9a60239c64..3c6f4c42ac 100644 --- a/docs/releases/1.5.11.txt +++ b/docs/releases/1.5.11.txt @@ -4,10 +4,13 @@ Django 1.5.11 release notes *Under development* -Django 1.5.11 fixes a regression in the 1.5.9 security release. +Django 1.5.11 fixes a couple regressions in the 1.5.9 security release. Bugfixes ======== +* Allowed related many-to-many fields to be referenced in the admin + (`#23604 `_). + * Allowed inline and hidden references to admin fields (`#23431 `_). diff --git a/docs/releases/1.6.8.txt b/docs/releases/1.6.8.txt index b209649ba4..9f8d3ab3a5 100644 --- a/docs/releases/1.6.8.txt +++ b/docs/releases/1.6.8.txt @@ -4,9 +4,12 @@ Django 1.6.8 release notes *Under development* -Django 1.6.8 fixes a regression in the 1.6.6 security release. +Django 1.6.8 fixes a couple regressions in the 1.6.6 security release. Bugfixes ======== +* Allowed related many-to-many fields to be referenced in the admin + (:ticket:`23604`). + * Allowed inline and hidden references to admin fields (:ticket:`23431`). diff --git a/docs/releases/1.7.1.txt b/docs/releases/1.7.1.txt index 2c8af6ac7e..c481a4b4c4 100644 --- a/docs/releases/1.7.1.txt +++ b/docs/releases/1.7.1.txt @@ -9,6 +9,9 @@ Django 1.7.1 fixes several bugs in 1.7. Bugfixes ======== +* Allowed related many-to-many fields to be referenced in the admin + (:ticket:`23604`). + * Added a more helpful error message if you try to migrate an app without first creating the ``contenttypes`` table (:ticket:`22411`). diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py index 7caca29c7b..4dcf40b610 100644 --- a/tests/admin_views/admin.py +++ b/tests/admin_views/admin.py @@ -37,7 +37,7 @@ from .models import (Article, Chapter, Child, Parent, Picture, Widget, State, City, Restaurant, Worker, ParentWithDependentChildren, DependentChild, StumpJoke, FieldOverridePost, FunkyTag, ReferencedByParent, ChildOfReferer, M2MReference, ReferencedByInline, - InlineReference, InlineReferer) + InlineReference, InlineReferer, Ingredient) def callable_year(dt_value): @@ -940,6 +940,7 @@ site.register(EmptyModelHidden, EmptyModelHiddenAdmin) site.register(EmptyModelVisible, EmptyModelVisibleAdmin) site.register(EmptyModelMixin, EmptyModelMixinAdmin) site.register(StumpJoke) +site.register(Ingredient) # Register core models we need in our tests from django.contrib.auth.models import User, Group diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py index fd37e8b79e..0d61ba3fbb 100644 --- a/tests/admin_views/models.py +++ b/tests/admin_views/models.py @@ -852,3 +852,13 @@ class InlineReference(models.Model): class InlineReferer(models.Model): refs = models.ManyToManyField(InlineReference) + + +# Models for #23604 +class Recipe(models.Model): + name = models.CharField(max_length=20) + + +class Ingredient(models.Model): + name = models.CharField(max_length=20) + recipes = models.ManyToManyField('Recipe', related_name='ingredients') diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 518e8fd7ba..abd590ed40 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -620,6 +620,10 @@ class AdminViewBasicTest(AdminViewBasicTestCase): response = self.client.get("/test_admin/admin/admin_views/m2mreference/", {TO_FIELD_VAR: 'id'}) self.assertEqual(response.status_code, 200) + # #23604 - Specifying the pk of this model should be allowed when this model defines a m2m relationship + response = self.client.get("/test_admin/admin/admin_views/ingredient/", {TO_FIELD_VAR: 'id'}) + self.assertEqual(response.status_code, 200) + # #23329 - Specifying a field that is not refered by any other model directly registered # to this admin site but registered through inheritance should be allowed. response = self.client.get("/test_admin/admin/admin_views/referencedbyparent/", {TO_FIELD_VAR: 'id'})