mirror of https://github.com/django/django.git
Fixed #10069 -- Fixed the model form unique validation code to not proceed with using, for example, RelatedObjects returned by get_field_by_name as though they were model Fields.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9777 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
9c6efb2eea
commit
795c229ae9
|
@ -224,7 +224,7 @@ class BaseModelForm(BaseForm):
|
||||||
return self.cleaned_data
|
return self.cleaned_data
|
||||||
|
|
||||||
def validate_unique(self):
|
def validate_unique(self):
|
||||||
from django.db.models.fields import FieldDoesNotExist
|
from django.db.models.fields import FieldDoesNotExist, Field as ModelField
|
||||||
|
|
||||||
# Gather a list of checks to perform. We only perform unique checks
|
# Gather a list of checks to perform. We only perform unique checks
|
||||||
# for fields present and not None in cleaned_data. Since this is a
|
# for fields present and not None in cleaned_data. Since this is a
|
||||||
|
@ -248,6 +248,12 @@ class BaseModelForm(BaseForm):
|
||||||
except FieldDoesNotExist:
|
except FieldDoesNotExist:
|
||||||
# This is an extra field that's not on the ModelForm, ignore it
|
# This is an extra field that's not on the ModelForm, ignore it
|
||||||
continue
|
continue
|
||||||
|
if not isinstance(f, ModelField):
|
||||||
|
# This is an extra field that happens to have a name that matches,
|
||||||
|
# for example, a related object accessor for this model. So
|
||||||
|
# get_field_by_name found it, but it is not a Field so do not proceed
|
||||||
|
# to use it as if it were.
|
||||||
|
continue
|
||||||
if f.unique and self.cleaned_data.get(name) is not None:
|
if f.unique and self.cleaned_data.get(name) is not None:
|
||||||
unique_checks.append((name,))
|
unique_checks.append((name,))
|
||||||
|
|
||||||
|
|
|
@ -193,6 +193,17 @@ Extra fields.
|
||||||
>>> CategoryForm.base_fields.keys()
|
>>> CategoryForm.base_fields.keys()
|
||||||
['name', 'slug', 'url', 'some_extra_field']
|
['name', 'slug', 'url', 'some_extra_field']
|
||||||
|
|
||||||
|
Extra field that has a name collision with a related object accessor.
|
||||||
|
|
||||||
|
>>> class WriterForm(ModelForm):
|
||||||
|
... book = forms.CharField(required=False)
|
||||||
|
...
|
||||||
|
... class Meta:
|
||||||
|
... model = Writer
|
||||||
|
|
||||||
|
>>> wf = WriterForm({'name': 'Richard Lockridge'})
|
||||||
|
>>> wf.is_valid()
|
||||||
|
True
|
||||||
|
|
||||||
Replacing a field.
|
Replacing a field.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue