Code

Ticket #6737: forms-error-messages.patch

File forms-error-messages.patch, 3.4 KB (added by nicklane, 6 years ago)
  • django/newforms/fields.py

    diff -r d56aac597a04 django/newforms/fields.py
    a b  
    1919from django.utils.translation import ugettext_lazy as _ 
    2020from django.utils.encoding import StrAndUnicode, smart_unicode, smart_str 
    2121 
    22 from util import ErrorList, ValidationError 
     22from util import ErrorList, ValidationError, build_class_error_messages 
    2323from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput 
    2424 
    2525 
     
    8383        self.creation_counter = Field.creation_counter 
    8484        Field.creation_counter += 1 
    8585 
    86         def set_class_error_messages(messages, klass): 
    87             for base_class in klass.__bases__: 
    88                 set_class_error_messages(messages, base_class) 
    89             messages.update(getattr(klass, 'default_error_messages', {})) 
    90  
    91         messages = {} 
    92         set_class_error_messages(messages, self.__class__) 
    93         messages.update(error_messages or {}) 
    94         self.error_messages = messages 
     86        self.error_messages = build_class_error_messages(self.__class__, 
     87            error_messages) 
    9588 
    9689    def clean(self, value): 
    9790        """ 
  • django/newforms/forms.py

    diff -r d56aac597a04 django/newforms/forms.py
    a b  
    1212from fields import Field, FileField 
    1313from widgets import TextInput, Textarea 
    1414from util import flatatt, ErrorDict, ErrorList, ValidationError 
     15from util import build_class_error_messages 
    1516 
    1617__all__ = ('BaseForm', 'Form') 
    1718 
     
    6465    # information. Any improvements to the form API should be made to *this* 
    6566    # class, not to the Form class. 
    6667    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
    67                  initial=None, error_class=ErrorList, label_suffix=':'): 
     68                 initial=None, error_class=ErrorList, label_suffix=':', 
     69                 error_messages=None): 
    6870        self.is_bound = data is not None or files is not None 
    6971        self.data = data or {} 
    7072        self.files = files or {} 
     
    8183        # Instances should always modify self.fields; they should not modify 
    8284        # self.base_fields. 
    8385        self.fields = deepcopy(self.base_fields) 
     86 
     87        self.error_messages = build_class_error_messages(self.__class__, 
     88            error_messages) 
    8489 
    8590    def __unicode__(self): 
    8691        return self.as_table() 
  • django/newforms/util.py

    diff -r d56aac597a04 django/newforms/util.py
    a b  
    6767        # AttributeError: ValidationError instance has no attribute 'args' 
    6868        # See http://www.python.org/doc/current/tut/node10.html#handling 
    6969        return repr(self.messages) 
     70 
     71def build_class_error_messages(klass, error_messages): 
     72    """ 
     73    Builds a dict of error messages from the ``default_error_messages`` 
     74    attributes of the given class, and all base classes. 
     75    """ 
     76    def set_class_error_messages(messages, klass): 
     77        for base_class in klass.__bases__: 
     78            set_class_error_messages(messages, base_class) 
     79        messages.update(getattr(klass, 'default_error_messages', {})) 
     80 
     81    messages = {} 
     82    set_class_error_messages(messages, klass) 
     83    messages.update(error_messages or {}) 
     84    return messages