Fixed #23604 -- Allowed related m2m fields to be references in the admin.

Thanks Simon Charette for review.
This commit is contained in:
Emmanuelle Delescolle 2014-10-05 20:06:51 +02:00 committed by Tim Graham
parent e501d4c505
commit a24cf21722
8 changed files with 37 additions and 5 deletions

View File

@ -451,6 +451,11 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)):
except FieldDoesNotExist: except FieldDoesNotExist:
return False 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 # Make sure at least one of the models registered for this site
# references this field through a FK or a M2M relationship. # references this field through a FK or a M2M relationship.
registered_models = set() registered_models = set()

View File

@ -4,12 +4,15 @@ Django 1.4.16 release notes
*Under development* *Under development*
Django 1.4.16 fixes a regression in the 1.4.14 security release and a bug Django 1.4.16 fixes a couple regressions in the 1.4.14 security release and a
preventing the use of some GEOS versions with GeoDjango. bug preventing the use of some GEOS versions with GeoDjango.
Bugfixes Bugfixes
======== ========
* Allowed related many-to-many fields to be referenced in the admin
(`#23604 <http://code.djangoproject.com/ticket/23604>`_).
* Allowed inline and hidden references to admin fields * Allowed inline and hidden references to admin fields
(`#23431 <http://code.djangoproject.com/ticket/23431>`_). (`#23431 <http://code.djangoproject.com/ticket/23431>`_).

View File

@ -4,10 +4,13 @@ Django 1.5.11 release notes
*Under development* *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 Bugfixes
======== ========
* Allowed related many-to-many fields to be referenced in the admin
(`#23604 <http://code.djangoproject.com/ticket/23604>`_).
* Allowed inline and hidden references to admin fields * Allowed inline and hidden references to admin fields
(`#23431 <http://code.djangoproject.com/ticket/23431>`_). (`#23431 <http://code.djangoproject.com/ticket/23431>`_).

View File

@ -4,9 +4,12 @@ Django 1.6.8 release notes
*Under development* *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 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`). * Allowed inline and hidden references to admin fields (:ticket:`23431`).

View File

@ -9,6 +9,9 @@ Django 1.7.1 fixes several bugs in 1.7.
Bugfixes 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 * Added a more helpful error message if you try to migrate an app without first
creating the ``contenttypes`` table (:ticket:`22411`). creating the ``contenttypes`` table (:ticket:`22411`).

View File

@ -37,7 +37,7 @@ from .models import (Article, Chapter, Child, Parent, Picture, Widget,
State, City, Restaurant, Worker, ParentWithDependentChildren, State, City, Restaurant, Worker, ParentWithDependentChildren,
DependentChild, StumpJoke, FieldOverridePost, FunkyTag, DependentChild, StumpJoke, FieldOverridePost, FunkyTag,
ReferencedByParent, ChildOfReferer, M2MReference, ReferencedByInline, ReferencedByParent, ChildOfReferer, M2MReference, ReferencedByInline,
InlineReference, InlineReferer) InlineReference, InlineReferer, Ingredient)
def callable_year(dt_value): def callable_year(dt_value):
@ -940,6 +940,7 @@ site.register(EmptyModelHidden, EmptyModelHiddenAdmin)
site.register(EmptyModelVisible, EmptyModelVisibleAdmin) site.register(EmptyModelVisible, EmptyModelVisibleAdmin)
site.register(EmptyModelMixin, EmptyModelMixinAdmin) site.register(EmptyModelMixin, EmptyModelMixinAdmin)
site.register(StumpJoke) site.register(StumpJoke)
site.register(Ingredient)
# Register core models we need in our tests # Register core models we need in our tests
from django.contrib.auth.models import User, Group from django.contrib.auth.models import User, Group

View File

@ -852,3 +852,13 @@ class InlineReference(models.Model):
class InlineReferer(models.Model): class InlineReferer(models.Model):
refs = models.ManyToManyField(InlineReference) 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')

View File

@ -620,6 +620,10 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
response = self.client.get("/test_admin/admin/admin_views/m2mreference/", {TO_FIELD_VAR: 'id'}) response = self.client.get("/test_admin/admin/admin_views/m2mreference/", {TO_FIELD_VAR: 'id'})
self.assertEqual(response.status_code, 200) 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 # #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. # 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'}) response = self.client.get("/test_admin/admin/admin_views/referencedbyparent/", {TO_FIELD_VAR: 'id'})