Django

Code

Changeset 4188

Show
Ignore:
Timestamp:
12/08/06 14:06:12 (2 years ago)
Author:
adrian
Message:

Fixed #3102 -- newforms: Fields can now designate their human-friendly labels. BoundField?.verbose_name is now BoundField?.label

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/newforms/fields.py

    r4187 r4188  
    3333    creation_counter = 0 
    3434 
    35     def __init__(self, required=True, widget=None): 
    36         self.required = required 
     35    def __init__(self, required=True, widget=None, label=None): 
     36        self.required, self.label = required, label 
    3737        widget = widget or self.widget 
    3838        if isinstance(widget, type): 
     
    7070 
    7171class CharField(Field): 
    72     def __init__(self, max_length=None, min_length=None, required=True, widget=None): 
     72    def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None): 
    7373        self.max_length, self.min_length = max_length, min_length 
    74         Field.__init__(self, required, widget
     74        Field.__init__(self, required, widget, label
    7575 
    7676    def clean(self, value): 
     
    112112 
    113113class DateField(Field): 
    114     def __init__(self, input_formats=None, required=True, widget=None): 
    115         Field.__init__(self, required, widget
     114    def __init__(self, input_formats=None, required=True, widget=None, label=None): 
     115        Field.__init__(self, required, widget, label
    116116        self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS 
    117117 
     
    148148 
    149149class DateTimeField(Field): 
    150     def __init__(self, input_formats=None, required=True, widget=None): 
    151         Field.__init__(self, required, widget
     150    def __init__(self, input_formats=None, required=True, widget=None, label=None): 
     151        Field.__init__(self, required, widget, label
    152152        self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS 
    153153 
     
    172172 
    173173class RegexField(Field): 
    174     def __init__(self, regex, error_message=None, required=True, widget=None): 
     174    def __init__(self, regex, error_message=None, required=True, widget=None, label=None): 
    175175        """ 
    176176        regex can be either a string or a compiled regular expression object. 
     
    178178        'Enter a valid value' is too generic for you. 
    179179        """ 
    180         Field.__init__(self, required, widget
     180        Field.__init__(self, required, widget, label
    181181        if isinstance(regex, basestring): 
    182182            regex = re.compile(regex) 
     
    204204 
    205205class EmailField(RegexField): 
    206     def __init__(self, required=True, widget=None): 
    207         RegexField.__init__(self, email_re, gettext(u'Enter a valid e-mail address.'), required, widget
     206    def __init__(self, required=True, widget=None, label=None): 
     207        RegexField.__init__(self, email_re, gettext(u'Enter a valid e-mail address.'), required, widget, label
    208208 
    209209url_re = re.compile( 
     
    221221 
    222222class URLField(RegexField): 
    223     def __init__(self, required=True, verify_exists=False, widget=None, 
     223    def __init__(self, required=True, verify_exists=False, widget=None, label=None, 
    224224            validator_user_agent=URL_VALIDATOR_USER_AGENT): 
    225         RegexField.__init__(self, url_re, gettext(u'Enter a valid URL.'), required, widget
     225        RegexField.__init__(self, url_re, gettext(u'Enter a valid URL.'), required, widget, label
    226226        self.verify_exists = verify_exists 
    227227        self.user_agent = validator_user_agent 
     
    257257 
    258258class ChoiceField(Field): 
    259     def __init__(self, choices=(), required=True, widget=Select): 
     259    def __init__(self, choices=(), required=True, widget=Select, label=None): 
    260260        if isinstance(widget, type): 
    261261            widget = widget(choices=choices) 
    262         Field.__init__(self, required, widget
     262        Field.__init__(self, required, widget, label
    263263        self.choices = choices 
    264264 
     
    278278 
    279279class MultipleChoiceField(ChoiceField): 
    280     def __init__(self, choices=(), required=True, widget=SelectMultiple): 
    281         ChoiceField.__init__(self, choices, required, widget
     280    def __init__(self, choices=(), required=True, widget=SelectMultiple, label=None): 
     281        ChoiceField.__init__(self, choices, required, widget, label
    282282 
    283283    def clean(self, value): 
     
    303303 
    304304class ComboField(Field): 
    305     def __init__(self, fields=(), required=True, widget=None): 
    306         Field.__init__(self, required, widget
     305    def __init__(self, fields=(), required=True, widget=None, label=None): 
     306        Field.__init__(self, required, widget, label
    307307        # Set 'required' to False on the individual fields, because the 
    308308        # required validation will be handled by ComboField, not by those 
  • django/trunk/django/newforms/forms.py

    r4182 r4188  
    8787                if errors_on_separate_row and bf_errors: 
    8888                    output.append(error_row % bf_errors) 
    89                 output.append(normal_row % {'errors': bf_errors, 'label': bf.label_tag(escape(bf.verbose_name+':')), 'field': bf}) 
     89                output.append(normal_row % {'errors': bf_errors, 'label': bf.label_tag(escape(bf.label+':')), 'field': bf}) 
    9090        if top_errors: 
    9191            output.insert(0, error_row % top_errors) 
     
    165165        self.field = field 
    166166        self.name = name 
     167        self.label = self.field.label or pretty_name(name) 
    167168 
    168169    def __unicode__(self): 
     
    214215    data = property(_data) 
    215216 
    216     def _verbose_name(self): 
    217         return pretty_name(self.name) 
    218     verbose_name = property(_verbose_name) 
    219  
    220217    def label_tag(self, contents=None): 
    221218        """ 
    222219        Wraps the given contents in a <label>, if the field has an ID attribute. 
    223220        Does not HTML-escape the contents. If contents aren't given, uses the 
    224         field's HTML-escaped verbose_name
    225         """ 
    226         contents = contents or escape(self.verbose_name
     221        field's HTML-escaped label
     222        """ 
     223        contents = contents or escape(self.label
    227224        widget = self.field.widget 
    228225        id_ = widget.attrs.get('id') or self.auto_id 
  • django/trunk/tests/regressiontests/forms/tests.py

    r4187 r4188  
    637637              Widget that it'll use if you don't specify this. In most cases, 
    638638              the default widget is TextInput. 
     639    label -- A verbose name for this field, for use in displaying this field in 
     640             a form. By default, Django will use a "pretty" version of the form 
     641             field name, if the Field is part of a Form. 
    639642 
    640643Other than that, the Field subclasses have class-specific options for 
     
    13361339<input type="text" name="birthday" value="1940-10-9" /> 
    13371340>>> for boundfield in p: 
    1338 ...     print boundfield.verbose_name, boundfield.data 
     1341...     print boundfield.label, boundfield.data 
    13391342First name John 
    13401343Last name Lennon 
     
    19091912<li>Password: <input type="password" name="password" maxlength="10" /></li> 
    19101913 
     1914You can specify the label for a field by using the 'label' argument to a Field 
     1915class. If you don't specify 'label', Django will use the field name with 
     1916underscores converted to spaces, and the initial letter capitalized. 
     1917>>> class UserRegistration(Form): 
     1918...    username = CharField(max_length=10, label='Your username') 
     1919...    password1 = CharField(widget=PasswordInput) 
     1920...    password2 = CharField(widget=PasswordInput, label='Password (again)') 
     1921>>> p = UserRegistration() 
     1922>>> print p.as_ul() 
     1923<li>Your username: <input type="text" name="username" maxlength="10" /></li> 
     1924<li>Password1: <input type="password" name="password1" /></li> 
     1925<li>Password (again): <input type="password" name="password2" /></li> 
     1926 
    19111927# Basic form processing in a view ############################################# 
    19121928 
     
    19952011</form> 
    19962012 
    1997 Use form.[field].verbose_name to output a field's "verbose name" -- its field 
    1998 name with underscores converted to spaces, and the initial letter capitalized. 
     2013Use form.[field].label to output a field's label. You can specify the label for 
     2014a field by using the 'label' argument to a Field class. If you don't specify 
     2015'label', Django will use the field name with underscores converted to spaces, 
     2016and the initial letter capitalized. 
    19992017>>> t = Template('''<form action=""> 
    2000 ... <p><label>{{ form.username.verbose_name }}: {{ form.username }}</label></p> 
    2001 ... <p><label>{{ form.password1.verbose_name }}: {{ form.password1 }}</label></p> 
    2002 ... <p><label>{{ form.password2.verbose_name }}: {{ form.password2 }}</label></p> 
     2018... <p><label>{{ form.username.label }}: {{ form.username }}</label></p> 
     2019... <p><label>{{ form.password1.label }}: {{ form.password1 }}</label></p> 
     2020... <p><label>{{ form.password2.label }}: {{ form.password2 }}</label></p> 
    20032021... <input type="submit" /> 
    20042022... </form>''') 
     
    20112029</form> 
    20122030 
    2013 User form.[field].label_tag to output a field's verbose_name with a <label> 
    2014 tag wrapped around it, but *only* if the given field has an "id" attribute. 
     2031User form.[field].label_tag to output a field's label with a <label> tag 
     2032wrapped around it, but *only* if the given field has an "id" attribute. 
    20152033Recall from above that passing the "auto_id" argument to a Form gives each 
    20162034field an "id" attribute.