Permalink
Browse files

Fixed #7551 -- Made GFK allow None init argument.

Thanks SamBull for the report.
  • Loading branch information...
Bouke authored and timgraham committed Oct 15, 2013
1 parent 763ac8b commit 3918eeb9fde03a2ad1941bce022615fff8eae34d
Showing with 29 additions and 3 deletions.
  1. +6 −2 django/contrib/contenttypes/generic.py
  2. +7 −0 tests/generic_relations/models.py
  3. +16 −1 tests/generic_relations/tests.py
@@ -59,8 +59,12 @@ def instance_pre_init(self, signal, sender, args, kwargs, **_kwargs):
"""
if self.name in kwargs:
value = kwargs.pop(self.name)
- kwargs[self.ct_field] = self.get_content_type(obj=value)
- kwargs[self.fk_field] = value._get_pk_val()
+ if value is not None:
+ kwargs[self.ct_field] = self.get_content_type(obj=value)
+ kwargs[self.fk_field] = value._get_pk_val()
+ else:
+ kwargs[self.ct_field] = None
+ kwargs[self.fk_field] = None
def get_content_type(self, obj=None, id=None, using=None):
if obj is not None:
@@ -137,3 +137,10 @@ class ConcreteRelatedModel(models.Model):
class ProxyRelatedModel(ConcreteRelatedModel):
class Meta:
proxy = True
+
+
+# To test fix for #7551
+class AllowsNullGFK(models.Model):
+ content_type = models.ForeignKey(ContentType, null=True)
+ object_id = models.PositiveIntegerField(null=True)
+ content_object = generic.GenericForeignKey()
@@ -4,11 +4,12 @@
from django.contrib.contenttypes.generic import generic_inlineformset_factory
from django.contrib.contenttypes.models import ContentType
from django.test import TestCase
+from django.utils import six
from .models import (TaggedItem, ValuableTaggedItem, Comparison, Animal,
Vegetable, Mineral, Gecko, Rock, ManualPK,
ForProxyModelModel, ForConcreteModelModel,
- ProxyRelatedModel, ConcreteRelatedModel)
+ ProxyRelatedModel, ConcreteRelatedModel, AllowsNullGFK)
class GenericRelationsTests(TestCase):
@@ -440,3 +441,17 @@ def test_generic_relation_set(self):
newrel.bases = [base]
newrel = ConcreteRelatedModel.objects.get(pk=newrel.pk)
self.assertEqual(base, newrel.bases.get())
+
+
+class TestInitWithNoneArgument(TestCase):
+ def test_none_not_allowed(self):
+ # TaggedItem requires a content_type, initializing with None should
+ # raise a ValueError.
+ with six.assertRaisesRegex(self, ValueError,
+ 'Cannot assign None: "TaggedItem.content_type" does not allow null values'):
+ TaggedItem(content_object=None)
+
+ def test_none_allowed(self):
+ # AllowsNullGFK doesn't require a content_type, so None argument should
+ # also be allowed.
+ AllowsNullGFK(content_object=None)

0 comments on commit 3918eeb

Please sign in to comment.