Kaydet (Commit) a24cf217 authored tarafından Emmanuelle Delescolle's avatar Emmanuelle Delescolle Kaydeden (comit) Tim Graham

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

Thanks Simon Charette for review.
üst e501d4c5
...@@ -451,6 +451,11 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)): ...@@ -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()
......
...@@ -4,12 +4,15 @@ Django 1.4.16 release notes ...@@ -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>`_).
......
...@@ -4,10 +4,13 @@ Django 1.5.11 release notes ...@@ -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>`_).
...@@ -4,9 +4,12 @@ Django 1.6.8 release notes ...@@ -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`).
...@@ -9,6 +9,9 @@ Django 1.7.1 fixes several bugs in 1.7. ...@@ -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`).
......
...@@ -37,7 +37,7 @@ from .models import (Article, Chapter, Child, Parent, Picture, Widget, ...@@ -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) ...@@ -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
......
...@@ -852,3 +852,13 @@ class InlineReference(models.Model): ...@@ -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')
...@@ -620,6 +620,10 @@ class AdminViewBasicTest(AdminViewBasicTestCase): ...@@ -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'})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment