mirror of https://github.com/django/django.git
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,
|
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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue