Commit d847ddfe authored by Loic Bistuer's avatar Loic Bistuer Committed by Tim Graham
Browse files

Fixed #3871 -- Fixed regression introduced by 04a2a6b0.

Added do_not_call_in_templates=True attribute to RelatedManagers
to prevent them from being called.

Thanks jbg@ for the report.
parent 4745ea1d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -335,6 +335,7 @@ def create_generic_related_manager(superclass):
                object_id_field_name = self.object_id_field_name,
                prefetch_cache_name = self.prefetch_cache_name,
            )
        do_not_call_in_templates = True

        def get_queryset(self):
            try:
+2 −0
Original line number Diff line number Diff line
@@ -377,6 +377,7 @@ def create_foreign_related_manager(superclass, rel_field, rel_model):
            manager = getattr(self.model, kwargs.pop('manager'))
            manager_class = create_foreign_related_manager(manager.__class__, rel_field, rel_model)
            return manager_class(self.instance)
        do_not_call_in_templates = True

        def get_queryset(self):
            try:
@@ -545,6 +546,7 @@ def create_many_related_manager(superclass, rel):
                through=self.through,
                prefetch_cache_name=self.prefetch_cache_name,
            )
        do_not_call_in_templates = True

        def get_queryset(self):
            try:
+26 −1
Original line number Diff line number Diff line
@@ -3,7 +3,9 @@ Various edge-cases for model managers.
"""

from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.utils.encoding import python_2_unicode_compatible, force_text


class OnlyFred(models.Manager):
@@ -119,3 +121,26 @@ class Child6(Child4):
# Will not inherit default manager from parent.
class Child7(Parent):
    pass


# RelatedManagers
@python_2_unicode_compatible
class RelatedModel(models.Model):
    test_gfk = generic.GenericRelation('RelationModel', content_type_field='gfk_ctype', object_id_field='gfk_id')

    def __str__(self):
        return force_text(self.pk)


@python_2_unicode_compatible
class RelationModel(models.Model):
    fk = models.ForeignKey(RelatedModel, related_name='test_fk')

    m2m = models.ManyToManyField(RelatedModel, related_name='test_m2m')

    gfk_ctype = models.ForeignKey(ContentType)
    gfk_id = models.IntegerField()
    gfk = generic.GenericForeignKey(ct_field='gfk_ctype', fk_field='gfk_id')

    def __str__(self):
        return force_text(self.pk)
+20 −1
Original line number Diff line number Diff line
@@ -4,8 +4,9 @@ import copy
from django.conf import settings
from django.db import models
from django.db.models.loading import cache
from django.template import Context, Template
from django.test import TestCase
from django.test.utils import override_settings
from django.utils.encoding import force_text

from .models import (
    Child1,
@@ -18,6 +19,8 @@ from .models import (
    AbstractBase1,
    AbstractBase2,
    AbstractBase3,
    RelatedModel,
    RelationModel,
)


@@ -193,3 +196,19 @@ class ManagersRegressionTests(TestCase):
            del settings.TEST_SWAPPABLE_MODEL
            cache.app_models = old_app_models
            cache.app_store = old_app_store

    def test_regress_3871(self):
        related = RelatedModel.objects.create()

        relation = RelationModel()
        relation.fk = related
        relation.gfk = related
        relation.save()
        relation.m2m.add(related)

        t = Template('{{ related.test_fk.all.0 }}{{ related.test_gfk.all.0 }}{{ related.test_m2m.all.0 }}')

        self.assertEqual(
            t.render(Context({'related': related})),
            ''.join([force_text(relation.pk)] * 3),
        )