Fixed #12420. Now that OneToOneField allows assignment of None, stop guarding against it in ModelForms. Thanks, andrewsk.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12545 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c05de31d75
commit
6ba5fb3728
|
@ -48,10 +48,6 @@ def construct_instance(form, instance, fields=None, exclude=None):
|
||||||
continue
|
continue
|
||||||
if exclude and f.name in exclude:
|
if exclude and f.name in exclude:
|
||||||
continue
|
continue
|
||||||
# OneToOneField doesn't allow assignment of None. Guard against that
|
|
||||||
# instead of allowing it and throwing an error.
|
|
||||||
if isinstance(f, models.OneToOneField) and cleaned_data[f.name] is None:
|
|
||||||
continue
|
|
||||||
# Defer saving file-type fields until after the other fields, so a
|
# Defer saving file-type fields until after the other fields, so a
|
||||||
# callable upload_to can use the values from other fields.
|
# callable upload_to can use the values from other fields.
|
||||||
if isinstance(f, models.FileField):
|
if isinstance(f, models.FileField):
|
||||||
|
|
|
@ -47,3 +47,10 @@ class RealPerson(models.Model):
|
||||||
if self.name.lower() == 'anonymous':
|
if self.name.lower() == 'anonymous':
|
||||||
raise ValidationError("Please specify a real name.")
|
raise ValidationError("Please specify a real name.")
|
||||||
|
|
||||||
|
class Author(models.Model):
|
||||||
|
publication = models.OneToOneField(Publication, null=True, blank=True)
|
||||||
|
full_name = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
class Author1(models.Model):
|
||||||
|
publication = models.OneToOneField(Publication, null=False)
|
||||||
|
full_name = models.CharField(max_length=255)
|
||||||
|
|
|
@ -6,7 +6,7 @@ from django.forms.models import modelform_factory
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from models import Person, RealPerson, Triple, FilePathModel, Article, Publication, CustomFF
|
from models import Person, RealPerson, Triple, FilePathModel, Article, Publication, CustomFF, Author, Author1
|
||||||
|
|
||||||
|
|
||||||
class ModelMultipleChoiceFieldTests(TestCase):
|
class ModelMultipleChoiceFieldTests(TestCase):
|
||||||
|
@ -152,3 +152,35 @@ class ModelClassTests(TestCase):
|
||||||
class NoModelModelForm(forms.ModelForm):
|
class NoModelModelForm(forms.ModelForm):
|
||||||
pass
|
pass
|
||||||
self.assertRaises(ValueError, NoModelModelForm)
|
self.assertRaises(ValueError, NoModelModelForm)
|
||||||
|
|
||||||
|
class OneToOneFieldTests(TestCase):
|
||||||
|
def test_assignment_of_none(self):
|
||||||
|
class AuthorForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Author
|
||||||
|
fields = ['publication', 'full_name']
|
||||||
|
|
||||||
|
publication = Publication.objects.create(title="Pravda",
|
||||||
|
date_published=date(1991, 8, 22))
|
||||||
|
author = Author.objects.create(publication=publication, full_name='John Doe')
|
||||||
|
form = AuthorForm({'publication':u'', 'full_name':'John Doe'}, instance=author)
|
||||||
|
self.assert_(form.is_valid())
|
||||||
|
self.assertEqual(form.cleaned_data['publication'], None)
|
||||||
|
author = form.save()
|
||||||
|
# author object returned from form still retains original publication object
|
||||||
|
# that's why we need to retreive it from database again
|
||||||
|
new_author = Author.objects.get(pk=author.pk)
|
||||||
|
self.assertEqual(new_author.publication, None)
|
||||||
|
|
||||||
|
def test_assignment_of_none_null_false(self):
|
||||||
|
class AuthorForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Author1
|
||||||
|
fields = ['publication', 'full_name']
|
||||||
|
|
||||||
|
publication = Publication.objects.create(title="Pravda",
|
||||||
|
date_published=date(1991, 8, 22))
|
||||||
|
author = Author1.objects.create(publication=publication, full_name='John Doe')
|
||||||
|
form = AuthorForm({'publication':u'', 'full_name':'John Doe'}, instance=author)
|
||||||
|
self.assert_(not form.is_valid())
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue