Skip to content

Commit

Permalink
Fixed #13138: Ensure required=False on a model form field overrides
Browse files Browse the repository at this point in the history
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
kmtracey committed Mar 18, 2010
1 parent e434573 commit 7471dab
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
11 changes: 7 additions & 4 deletions django/forms/models.py
Expand Up @@ -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

Expand Down
9 changes: 8 additions & 1 deletion 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:
Expand Down Expand Up @@ -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
7 changes: 6 additions & 1 deletion tests/modeltests/model_forms/tests.py
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 7471dab

Please sign in to comment.