Ticket #12420: t12420_4.diff

File t12420_4.diff, 3.7 KB (added by Andrii Kurinnyi, 14 years ago)
  • django/forms/models.py

    diff --git a/django/forms/models.py b/django/forms/models.py
    index f343a1c..45b35a0 100644
    a b def construct_instance(form, instance, fields=None, exclude=None):  
    4848            continue
    4949        if exclude and f.name in exclude:
    5050            continue
    51         # OneToOneField doesn't allow assignment of None. Guard against that
    52         # instead of allowing it and throwing an error.
    53         if isinstance(f, models.OneToOneField) and cleaned_data[f.name] is None:
    54             continue
    5551        # Defer saving file-type fields until after the other fields, so a
    5652        # callable upload_to can use the values from other fields.
    5753        if isinstance(f, models.FileField):
  • tests/regressiontests/model_forms_regress/models.py

    diff --git a/tests/regressiontests/model_forms_regress/models.py b/tests/regressiontests/model_forms_regress/models.py
    index 376586e..e2f0e19 100644
    a b class CustomFileField(models.FileField):  
    3737
    3838class CustomFF(models.Model):
    3939    f = CustomFileField(upload_to='unused', blank=True)
     40
     41class Author(models.Model):
     42    publication = models.OneToOneField(Publication, null=True, blank=True)
     43    full_name = models.CharField(max_length=255)
     44
     45class Author1(models.Model):
     46    publication = models.OneToOneField(Publication, null=False)
     47    full_name = models.CharField(max_length=255)
  • tests/regressiontests/model_forms_regress/tests.py

    diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py
    index 57d5655..4324110 100644
    a b from django.forms.models import modelform_factory  
    66from django.conf import settings
    77from django.test import TestCase
    88
    9 from models import Person, Triple, FilePathModel, Article, Publication, CustomFF
     9from models import Person, Triple, FilePathModel, Article, Publication, CustomFF, Author, Author1
    1010
    1111class ModelMultipleChoiceFieldTests(TestCase):
    1212
    class ModelChoiceIteratorTests(TestCase):  
    134134            date_published=date(1991, 8, 22))
    135135        f = Form()
    136136        self.assertEqual(len(f.fields["publications"].choices), 1)
     137
     138class OneToOneFieldTests(TestCase):
     139    def test_assignment_of_none(self):
     140        class AuthorForm(forms.ModelForm):
     141            class Meta:
     142                model = Author
     143                fields = ['publication', 'full_name']
     144
     145        publication = Publication.objects.create(title="Pravda",
     146            date_published=date(1991, 8, 22))
     147        author = Author.objects.create(publication=publication, full_name='John Doe')
     148        form = AuthorForm({'publication':u'', 'full_name':'John Doe'}, instance=author)
     149        self.assert_(form.is_valid())
     150        self.assertEqual(form.cleaned_data['publication'], None)
     151        author = form.save()
     152        #author object returned from form still retains original publication object
     153        #that's why we need to retreive it from database again
     154        new_author = Author.objects.get(pk=author.pk)
     155        self.assertEqual(new_author.publication, None)
     156
     157    def test_assignment_of_none_null_false(self):
     158        class AuthorForm(forms.ModelForm):
     159            class Meta:
     160                model = Author1
     161                fields = ['publication', 'full_name']
     162
     163        publication = Publication.objects.create(title="Pravda",
     164            date_published=date(1991, 8, 22))
     165        author = Author1.objects.create(publication=publication, full_name='John Doe')
     166        form = AuthorForm({'publication':u'', 'full_name':'John Doe'}, instance=author)
     167        self.assert_(not form.is_valid())
Back to Top