Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #13138: Ensure required=False on a model form field overrides

blank=False on the underlying model field during model form clean, 
in order to maintain backward compatibility. Thanks to saxon75 for 
the report.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@12802 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 7471dab660d916ab2ebd6b943aec6c2b1145e744 1 parent e434573
@kmtracey kmtracey authored
View
11 django/forms/models.py
@@ -292,13 +292,16 @@ def _get_validation_exclusions(self):
elif field in self._errors.keys():
exclude.append(f.name)
- # Exclude empty fields that are not required by the form. The
- # underlying model field may be required, so this keeps the model
- # field from raising that error.
+ # Exclude empty fields that are not required by the form, if the
+ # underlying model field is required. This keeps the model field
+ # from raising a required error. Note: don't exclude the field from
+ # validaton if the model field allows blanks. If it does, the blank
+ # value may be included in a unique check, so cannot be excluded
+ # from validation.
else:
form_field = self.fields[field]
field_value = self.cleaned_data.get(field, None)
- if field_value is None and not form_field.required:
+ if not f.blank and not form_field.required and field_value in EMPTY_VALUES:
exclude.append(f.name)
return exclude
View
9 tests/modeltests/model_forms/mforms.py
@@ -1,6 +1,7 @@
+from django import forms
from django.forms import ModelForm
-from models import Product, Price, Book, DerivedBook, ExplicitPK, Post, DerivedPost
+from models import Product, Price, Book, DerivedBook, ExplicitPK, Post, DerivedPost, Writer
class ProductForm(ModelForm):
class Meta:
@@ -30,3 +31,9 @@ class Meta:
class DerivedPostForm(ModelForm):
class Meta:
model = DerivedPost
+
+class CustomWriterForm(ModelForm):
+ name = forms.CharField(required=False)
+
+ class Meta:
+ model = Writer
View
7 tests/modeltests/model_forms/tests.py
@@ -2,7 +2,8 @@
from django.test import TestCase
from django import forms
from models import Category, Writer, Book, DerivedBook, Post
-from mforms import ProductForm, PriceForm, BookForm, DerivedBookForm, ExplicitPKForm, PostForm, DerivedPostForm
+from mforms import (ProductForm, PriceForm, BookForm, DerivedBookForm,
+ ExplicitPKForm, PostForm, DerivedPostForm, CustomWriterForm)
class IncompleteCategoryFormWithFields(forms.ModelForm):
@@ -37,6 +38,10 @@ def test_validates_with_replaced_field_excluded(self):
form = IncompleteCategoryFormWithExclude(data={'name': 'some name', 'slug': 'some-slug'})
assert form.is_valid()
+ def test_notrequired_overrides_notblank(self):
+ form = CustomWriterForm({})
+ assert form.is_valid()
+
# unique/unique_together validation
class UniqueTest(TestCase):
def setUp(self):
Please sign in to comment.
Something went wrong with that request. Please try again.