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, object_id_field_name = self.object_id_field_name,
prefetch_cache_name = self.prefetch_cache_name, prefetch_cache_name = self.prefetch_cache_name,
) )
do_not_call_in_templates = True
def get_queryset(self): def get_queryset(self):
try: 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 = getattr(self.model, kwargs.pop('manager'))
manager_class = create_foreign_related_manager(manager.__class__, rel_field, rel_model) manager_class = create_foreign_related_manager(manager.__class__, rel_field, rel_model)
return manager_class(self.instance) return manager_class(self.instance)
do_not_call_in_templates = True
def get_queryset(self): def get_queryset(self):
try: try:
@ -545,6 +546,7 @@ def create_many_related_manager(superclass, rel):
through=self.through, through=self.through,
prefetch_cache_name=self.prefetch_cache_name, prefetch_cache_name=self.prefetch_cache_name,
) )
do_not_call_in_templates = True
def get_queryset(self): def get_queryset(self):
try: try:

View File

@ -3,7 +3,9 @@ Various edge-cases for model managers.
""" """
from django.db import models 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): class OnlyFred(models.Manager):
@ -119,3 +121,26 @@ class Child6(Child4):
# Will not inherit default manager from parent. # Will not inherit default manager from parent.
class Child7(Parent): class Child7(Parent):
pass 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.conf import settings
from django.db import models from django.db import models
from django.db.models.loading import cache from django.db.models.loading import cache
from django.template import Context, Template
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.utils.encoding import force_text
from .models import ( from .models import (
Child1, Child1,
@ -18,6 +19,8 @@ from .models import (
AbstractBase1, AbstractBase1,
AbstractBase2, AbstractBase2,
AbstractBase3, AbstractBase3,
RelatedModel,
RelationModel,
) )
@ -193,3 +196,19 @@ class ManagersRegressionTests(TestCase):
del settings.TEST_SWAPPABLE_MODEL del settings.TEST_SWAPPABLE_MODEL
cache.app_models = old_app_models cache.app_models = old_app_models
cache.app_store = old_app_store 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),
)