Commit 3d35ea43 authored by Simon Charette's avatar Simon Charette Committed by Tim Graham
Browse files

[1.5.x] Fixed #23754 -- Always allowed reference to the primary key in the admin

This change allows dynamically created inlines "Add related" button to work
correcly as long as their associated foreign key is pointing to the primary
key of the related model.

Thanks to amorce for the report, Julien Phalip for the initial patch,
and Collin Anderson for the review.

Backport of f9c4e14a from master
parent 17ffd24d
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -287,9 +287,9 @@ 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:
        # Always allow referencing the primary key since it's already possible
        # to get this information from the change view URL.
        if field.primary_key:
            return True

        # Make sure at least one of the models registered for this site
@@ -300,8 +300,7 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)):
            for inline in admin.inlines:
                registered_models.add(inline.model)

        for related_object in (opts.get_all_related_objects(include_hidden=True) +
                               opts.get_all_related_many_to_many_objects()):
        for related_object in opts.get_all_related_objects(include_hidden=True):
            related_model = related_object.model
            if (any(issubclass(model, related_model) for model in registered_models) and
                    related_object.field.rel.get_related_field() == field):
+14 −0
Original line number Diff line number Diff line
===========================
Django 1.5.12 release notes
===========================

*Under development*

Django 1.5.12 fixes a regression in the 1.5.9 security release.

Bugfixes
========

* Fixed a regression with dynamically generated inlines and allowed field
  references in the admin
  (`#23754 <http://code.djangoproject.com/ticket/23754>`_).
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ versions of the documentation contain the release notes for any later releases.
.. toctree::
   :maxdepth: 1

   1.5.12
   1.5.11
   1.5.10
   1.5.9
+3 −2
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
    AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
    RelatedPrepopulated, UndeletableObject, UserMessenger, Simple, Choice,
    ShortMessage, Telegram, ReferencedByParent, ChildOfReferer, M2MReference,
    ReferencedByInline, InlineReference, InlineReferer, Ingredient)
    ReferencedByInline, InlineReference, InlineReferer, Recipe, Ingredient, NotReferenced)


def callable_year(dt_value):
@@ -714,7 +714,6 @@ site.register(UnorderedObject, UnorderedObjectAdmin)
site.register(UndeletableObject, UndeletableObjectAdmin)
site.register(ReferencedByParent)
site.register(ChildOfReferer)
site.register(M2MReference)
site.register(ReferencedByInline)
site.register(InlineReferer, InlineRefererAdmin)

@@ -746,7 +745,9 @@ site.register(Color2, CustomTemplateFilterColorAdmin)
site.register(Simple, AttributeErrorRaisingAdmin)
site.register(UserMessenger, MessageTestingAdmin)
site.register(Choice, ChoiceList)
site.register(Recipe)
site.register(Ingredient)
site.register(NotReferenced)

# Register core models we need in our tests
from django.contrib.auth.models import User, Group
+17 −7
Original line number Diff line number Diff line
@@ -682,11 +682,13 @@ class Choice(models.Model):

# Models for #23329
class ReferencedByParent(models.Model):
    pass
    name = models.CharField(max_length=20, unique=True)


class ParentWithFK(models.Model):
    fk = models.ForeignKey(ReferencedByParent)
    fk = models.ForeignKey(
        ReferencedByParent, to_field='name', related_name='hidden+',
    )


class ChildOfReferer(ParentWithFK):
@@ -696,13 +698,16 @@ class ChildOfReferer(ParentWithFK):
class M2MReference(models.Model):
    ref = models.ManyToManyField('self')


# Models for #23431
class ReferencedByInline(models.Model):
    pass
    name = models.CharField(max_length=20, unique=True)


class InlineReference(models.Model):
    fk = models.ForeignKey(ReferencedByInline, related_name='hidden+')
    fk = models.ForeignKey(
        ReferencedByInline, to_field='name', related_name='hidden+',
    )


class InlineReferer(models.Model):
@@ -711,9 +716,14 @@ class InlineReferer(models.Model):

# Models for #23604
class Recipe(models.Model):
    name = models.CharField(max_length=20)
    pass


class Ingredient(models.Model):
    name = models.CharField(max_length=20)
    recipes = models.ManyToManyField('Recipe', related_name='ingredients')
    recipes = models.ManyToManyField(Recipe)


# Model for #23839
class NotReferenced(models.Model):
    # Don't point any FK at this model.
    pass
Loading