mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	[1.7.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:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							e9609fb7a1
						
					
				
				
					commit
					f8d845910b
				
			| @@ -447,6 +447,11 @@ class BaseModelAdmin(six.with_metaclass(RenameBaseModelAdminMethods)): | |||||||
|         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 | |||||||
|  |  | ||||||
| *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 | |||||||
|  |  | ||||||
| *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 | |||||||
|  |  | ||||||
| *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. | |||||||
| 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, | |||||||
|     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): | ||||||
| @@ -932,6 +932,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): | |||||||
|  |  | ||||||
| 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') | ||||||
|   | |||||||
| @@ -621,6 +621,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'}) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user