[1.4.x] Fixed #23604 -- Allowed related m2m fields to be references in the admin.

Thanks Simon Charette for review.

Backport of a24cf21722 from master
This commit is contained in:
Emmanuelle Delescolle 2014-10-05 20:06:51 +02:00 committed by Tim Graham
parent df657a7682
commit f58392d8d8
5 changed files with 25 additions and 3 deletions

View File

@ -281,6 +281,11 @@ class BaseModelAdmin(object):
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()

View File

@ -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 <http://code.djangoproject.com/ticket/23604>`_).
* Allowed inline and hidden references to admin fields
(`#23431 <http://code.djangoproject.com/ticket/23431>`_).

View File

@ -28,7 +28,7 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
RelatedPrepopulated, ReferencedByParent, ChildOfReferer, M2MReference,
ReferencedByInline, InlineReference, InlineReferer)
ReferencedByInline, InlineReference, InlineReferer, Ingredient)
def callable_year(dt_value):
@ -656,6 +656,7 @@ site.register(AdminOrderedModelMethod, AdminOrderedModelMethodAdmin)
site.register(AdminOrderedAdminMethod, AdminOrderedAdminMethodAdmin)
site.register(AdminOrderedCallable, AdminOrderedCallableAdmin)
site.register(Color2, CustomTemplateFilterColorAdmin)
site.register(Ingredient)
# Register core models we need in our tests
from django.contrib.auth.models import User, Group

View File

@ -637,3 +637,12 @@ 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')

View File

@ -590,6 +590,10 @@ class AdminViewBasicTest(TestCase):
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'})