Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

We’re showing branches in this repository, but you can also compare across forks.

base fork: django/django
...
head fork: loic/django
compare: manager.__call__
  • 1 commit
  • 4 files changed
  • 0 commit comments
  • 1 contributor
Commits on Sep 30, 2013
Loïc Bistuer loic Fixed regression introduced by 04a2a6b.
it tries to call it. By adding a do_not_call_in_templates=True attribute
to RelatedManager we prevent this behavior.

Thanks jbg@ for the report.

Fixed #3871
13f1277
1  django/contrib/contenttypes/generic.py
View
@@ -335,6 +335,7 @@ def __call__(self, **kwargs):
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  django/db/models/fields/related.py
View
@@ -379,6 +379,7 @@ def __call__(self, **kwargs):
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:
@@ -540,6 +541,7 @@ def __call__(self, **kwargs):
through=self.through,
prefetch_cache_name=self.prefetch_cache_name,
)
+ do_not_call_in_templates = True
def get_queryset(self):
try:
27 tests/managers_regress/models.py
View
@@ -3,7 +3,9 @@
"""
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)
21 tests/managers_regress/tests.py
View
@@ -4,8 +4,9 @@
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 @@
AbstractBase1,
AbstractBase2,
AbstractBase3,
+ RelatedModel,
+ RelationModel,
)
@@ -193,3 +196,19 @@ class Meta:
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),
+ )

No commit comments for this range

Something went wrong with that request. Please try again.