Ticket #12420: t12420_1.diff

File t12420_1.diff, 3.0 KB (added by Andrii Kurinnyi, 8 years ago)

Better patch with tests

  • django/forms/models.py

    diff --git a/django/forms/models.py b/django/forms/models.py
    index f343a1c..637c6bf 100644
    a b def construct_instance(form, instance, fields=None, exclude=None): 
    5050            continue
    5151        # OneToOneField doesn't allow assignment of None. Guard against that
    5252        # instead of allowing it and throwing an error.
    53         if isinstance(f, models.OneToOneField) and cleaned_data[f.name] is None:
     53        if isinstance(f, models.OneToOneField) and not f.null and cleaned_data[f.name] is None:
    5454            continue
    5555        # Defer saving file-type fields until after the other fields, so a
    5656        # callable upload_to can use the values from other fields.
  • 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..4bddda1 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)
  • 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..5dfbe00 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
    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_non_assignment(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        if 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)
Back to Top