Fixed #8795: unique_together validation no longer fails on model forms that exclude fields included in the check. Thanks, Alex Gaynor.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8854 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jacob Kaplan-Moss 2008-09-02 14:20:11 +00:00
parent 5c32fe7fad
commit 98e1cc92f4
2 changed files with 20 additions and 2 deletions

View File

@ -210,10 +210,20 @@ class BaseModelForm(BaseForm):
def validate_unique(self): def validate_unique(self):
from django.db.models.fields import FieldDoesNotExist from django.db.models.fields import FieldDoesNotExist
unique_checks = list(self.instance._meta.unique_together[:])
# Gather a list of checks to perform. Since this is a ModelForm, some
# fields may have been excluded; we can't perform a unique check on a
# form that is missing fields involved in that check.
unique_checks = []
for check in self.instance._meta.unique_together[:]:
fields_on_form = [field for field in check if field in self.fields]
if len(fields_on_form) == len(check):
unique_checks.append(check)
form_errors = [] form_errors = []
# Make sure the unique checks apply to actual fields on the ModelForm # Gather a list of checks for fields declared as unique and add them to
# the list of checks. Again, skip fields not on the form.
for name, field in self.fields.items(): for name, field in self.fields.items():
try: try:
f = self.instance._meta.get_field_by_name(name)[0] f = self.instance._meta.get_field_by_name(name)[0]

View File

@ -1192,6 +1192,14 @@ False
>>> form._errors >>> form._errors
{'__all__': [u'Price with this Price and Quantity already exists.']} {'__all__': [u'Price with this Price and Quantity already exists.']}
>>> class PriceForm(ModelForm):
... class Meta:
... model = Price
... exclude = ('quantity',)
>>> form = PriceForm({'price': '6.00'})
>>> form.is_valid()
True
# Choices on CharField and IntegerField # Choices on CharField and IntegerField
>>> class ArticleForm(ModelForm): >>> class ArticleForm(ModelForm):
... class Meta: ... class Meta: