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:
parent
4745ea1d27
commit
d847ddfe1d
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue