Commit 7471dab6 authored by Karen Tracey's avatar Karen Tracey
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
parent e434573e
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -292,13 +292,16 @@ class BaseModelForm(BaseForm):
            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

+8 −1
Original line number Diff line number Diff line
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 PostForm(ModelForm):
class DerivedPostForm(ModelForm):
    class Meta:
        model = DerivedPost

class CustomWriterForm(ModelForm):
   name = forms.CharField(required=False)

   class Meta:
       model = Writer
+6 −1
Original line number Diff line number Diff line
@@ -2,7 +2,8 @@ import datetime
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 @@ class ValidationTest(TestCase):
        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):