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

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

Thanks jbg@ for the report.
This commit is contained in:
Loic Bistuer 2013-09-30 10:21:21 +07:00 committed by Tim Graham
parent 4745ea1d27
commit d847ddfe1d
4 changed files with 49 additions and 2 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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)

View File

@ -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),
)