Ticket #10427: django-forms-value.7.diff

File django-forms-value.7.diff, 4.3 KB (added by Ludvig Ericson, 15 years ago)

Against trunk r10454

  • django/forms/forms.py

     
    375375        auto_id = self.auto_id
    376376        if auto_id and 'id' not in attrs and 'id' not in widget.attrs:
    377377            attrs['id'] = auto_id
    378         if not self.form.is_bound:
    379             data = self.form.initial.get(self.name, self.field.initial)
    380             if callable(data):
    381                 data = data()
    382         else:
    383             data = self.data
    384378        if not only_initial:
    385379            name = self.html_name
    386380        else:
    387381            name = self.html_initial_name
    388         return widget.render(name, data, attrs=attrs)
     382        return widget.render(name, self.value, attrs=attrs)
    389383
    390384    def as_text(self, attrs=None, **kwargs):
    391385        """
     
    410404        return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
    411405    data = property(_data)
    412406
     407    def _value(self):
     408        """
     409        Returns the value for this BoundField, as rendered in widgets.
     410        """
     411        if not self.form.is_bound:
     412            val = self.form.initial.get(self.name, self.field.initial)
     413            if callable(val):
     414                val = val()
     415        else:
     416            val = self.data
     417        if val is None:
     418            val = ''
     419        return val
     420    value = property(_value)
     421
    413422    def label_tag(self, contents=None, attrs=None):
    414423        """
    415424        Wraps the given contents in a <label>, if the field has an ID attribute.
  • tests/regressiontests/forms/forms.py

     
    11961196<li>Username: <input type="text" name="username" value="stephane" maxlength="10" /></li>
    11971197<li>Password: <input type="password" name="password" /></li>
    11981198
     1199# Bound field values ##########################################################
     1200
     1201It's possible to get to the value which would be used for rendering the widget
     1202for a field by using the BoundField's value attribute.
     1203
     1204>>> class UserRegistration(Form):
     1205...    username = CharField(max_length=10, initial='djangonaut')
     1206...    password = CharField(widget=PasswordInput)
     1207>>> p = UserRegistration({'password': 'foo'})
     1208>>> print 'username.value =', p['username'].value
     1209username.value =
     1210>>> print 'username.data = ', p['username'].data
     1211username.data = None
     1212>>> print 'password.value =', p['password'].value
     1213password.value = foo
     1214>>> print 'password.data =', p['password'].data
     1215password.data = foo
     1216
     1217The value of username is empty because the form is bound -- the value wasn't
     1218specified, and so is empty. This differs if the form were to be unbound:
     1219
     1220>>> p = UserRegistration()
     1221>>> print p['username'].value
     1222djangonaut
     1223
    11991224# Help text ###################################################################
    12001225
    12011226You can specify descriptive text for a field by using the 'help_text' argument
  • docs/ref/forms/fields.txt

     
    257257In the `built-in Field classes`_ section below, each ``Field`` defines the
    258258error message keys it uses.
    259259
     260Field data versus value
     261~~~~~~~~~~~~~~~~~~~~~~~
     262
     263.. versionadded:: 1.1
     264
     265.. attribute:: Field.value
     266.. attribute:: Field.data
     267
     268Sometimes, it's necessary -- or at least easier -- to render the form entirely
     269on your own. In such a case, you might want to get to what Django's form
     270rendering would use for the HTML `value` attribute.
     271
     272It's quite easy, actually::
     273
     274    >>> f = CommentForm({'comment': 'Foobar'}, initial={'name': 'instance'})
     275    >>> f['name'].value
     276    'instance'
     277    >>> f['comment'].value
     278    'Foobar'
     279
     280The value attribute takes initial data into account on form level (i.e.,
     281passing it to the initializer as seen in previous section), as well as field
     282level.
     283
     284The resolution process is, step by step, the following:
     285
     286 1. If the form has data for this field, use it;
     287 2. if the form has initial data for this field, use it;
     288 3. if the field has initial data, use it; and lastly
     289 4. use the empty string.
     290
    260291Built-in ``Field`` classes
    261292--------------------------
    262293
Back to Top