From a7c320fea79b8750ab2a8aca84d8e8fb76d8b100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Honza=20Kr=C3=A1l?= Date: Mon, 4 Jan 2010 00:22:13 +0000 Subject: [PATCH] [soc2009/model-validation] Raise UnresolvableValidationError if an error occurs on excluded field git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/model-validation@12072 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/exceptions.py | 10 +++++++++- django/forms/models.py | 8 ++++++-- tests/modeltests/model_forms/models.py | 6 +++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/django/core/exceptions.py b/django/core/exceptions.py index 29da67cfa6..9cdfd22026 100644 --- a/django/core/exceptions.py +++ b/django/core/exceptions.py @@ -33,7 +33,7 @@ class FieldError(Exception): pass NON_FIELD_ERRORS = '__all__' -class ValidationError(Exception): +class BaseValidationError(Exception): """An error while validating data.""" def __init__(self, message, code=None, params=None): import operator @@ -63,3 +63,11 @@ class ValidationError(Exception): if hasattr(self, 'message_dict'): return repr(self.message_dict) return repr(self.messages) + +class ValidationError(BaseValidationError): + pass + +class UnresolvableValidationError(BaseValidationError): + """Validation error that cannot be resolved by the user.""" + pass + diff --git a/django/forms/models.py b/django/forms/models.py index 12cfcdbfe5..7ab70c6883 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -9,7 +9,7 @@ from django.utils.datastructures import SortedDict from django.utils.text import get_text_list, capfirst from django.utils.translation import ugettext_lazy as _, ugettext -from django.core.exceptions import ValidationError, NON_FIELD_ERRORS +from django.core.exceptions import ValidationError, NON_FIELD_ERRORS, UnresolvableValidationError from django.core.validators import EMPTY_VALUES from util import ErrorList from forms import BaseForm, get_declared_fields @@ -254,10 +254,14 @@ class BaseModelForm(BaseForm): if k in self.cleaned_data: del self.cleaned_data[k] - # what about fields that don't validate but aren't present on the form? if NON_FIELD_ERRORS in e.message_dict: raise ValidationError(e.message_dict[NON_FIELD_ERRORS]) + # there are errors on some fields not displayed in this form + if set(e.message_dict.keys()) - set(self.fields.keys() + [NON_FIELD_ERRORS]): + raise UnresolvableValidationError(e.message_dict) + + return self.cleaned_data def save(self, commit=True): diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index 90b8219e08..ca5560582a 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -1432,9 +1432,9 @@ False ... exclude = ('quantity',) >>> form = PriceForm({'price': '6.00'}) >>> form.is_valid() -False ->>> form.errors -{'quantity': [u'This field cannot be null.']} +Traceback (most recent call last): + ... +UnresolvableValidationError: {'quantity': [u'This field cannot be null.']} # Unique & unique together with null values >>> class BookForm(ModelForm):