Fixed #4860: added 'for' attributes to labels in newforms widgets. Thanks to Ivan Sagalaev and batiste@dosimple.ch for the patches.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@7693 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
2b62e945b0
commit
1a75b5a03c
1
AUTHORS
1
AUTHORS
|
@ -65,6 +65,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Mikaël Barbero <mikael.barbero nospam at nospam free.fr>
|
Mikaël Barbero <mikael.barbero nospam at nospam free.fr>
|
||||||
Jiri Barton
|
Jiri Barton
|
||||||
Ned Batchelder <http://www.nedbatchelder.com/>
|
Ned Batchelder <http://www.nedbatchelder.com/>
|
||||||
|
batiste@dosimple.ch
|
||||||
Shannon -jj Behrens <http://jjinux.blogspot.com/>
|
Shannon -jj Behrens <http://jjinux.blogspot.com/>
|
||||||
Esdras Beleza <linux@esdrasbeleza.com>
|
Esdras Beleza <linux@esdrasbeleza.com>
|
||||||
Chris Bennett <chrisrbennett@yahoo.com>
|
Chris Bennett <chrisrbennett@yahoo.com>
|
||||||
|
|
|
@ -281,8 +281,12 @@ class RadioInput(StrAndUnicode):
|
||||||
self.index = index
|
self.index = index
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return mark_safe(u'<label>%s %s</label>' % (self.tag(),
|
if 'id' in self.attrs:
|
||||||
conditional_escape(force_unicode(self.choice_label))))
|
label_for = ' for="%s_%s"' % (self.attrs['id'], self.index)
|
||||||
|
else:
|
||||||
|
label_for = ''
|
||||||
|
choice_label = conditional_escape(force_unicode(self.choice_label))
|
||||||
|
return mark_safe(u'<label%s>%s %s</label>' % (label_for, self.tag(), choice_label))
|
||||||
|
|
||||||
def is_checked(self):
|
def is_checked(self):
|
||||||
return self.value == self.choice_value
|
return self.value == self.choice_value
|
||||||
|
@ -364,11 +368,15 @@ class CheckboxSelectMultiple(SelectMultiple):
|
||||||
# so that the checkboxes don't all have the same ID attribute.
|
# so that the checkboxes don't all have the same ID attribute.
|
||||||
if has_id:
|
if has_id:
|
||||||
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
|
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
|
||||||
|
label_for = u' for="%s"' % final_attrs['id']
|
||||||
|
else:
|
||||||
|
label_for = ''
|
||||||
|
|
||||||
cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
|
cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
|
||||||
option_value = force_unicode(option_value)
|
option_value = force_unicode(option_value)
|
||||||
rendered_cb = cb.render(name, option_value)
|
rendered_cb = cb.render(name, option_value)
|
||||||
output.append(u'<li><label>%s %s</label></li>' % (rendered_cb,
|
option_label = conditional_escape(force_unicode(option_label))
|
||||||
conditional_escape(force_unicode(option_label))))
|
output.append(u'<li><label%s>%s %s</label></li>' % (label_for, rendered_cb, option_label))
|
||||||
output.append(u'</ul>')
|
output.append(u'</ul>')
|
||||||
return mark_safe(u'\n'.join(output))
|
return mark_safe(u'\n'.join(output))
|
||||||
|
|
||||||
|
|
|
@ -443,8 +443,8 @@ zero-based index.
|
||||||
>>> f = FrameworkForm(auto_id='id_%s')
|
>>> f = FrameworkForm(auto_id='id_%s')
|
||||||
>>> print f['language']
|
>>> print f['language']
|
||||||
<ul>
|
<ul>
|
||||||
<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
||||||
<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
When RadioSelect is used with auto_id, and the whole form is printed using
|
When RadioSelect is used with auto_id, and the whole form is printed using
|
||||||
|
@ -453,20 +453,20 @@ ID of the *first* radio button.
|
||||||
>>> print f
|
>>> print f
|
||||||
<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr>
|
<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr>
|
||||||
<tr><th><label for="id_language_0">Language:</label></th><td><ul>
|
<tr><th><label for="id_language_0">Language:</label></th><td><ul>
|
||||||
<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
||||||
<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
||||||
</ul></td></tr>
|
</ul></td></tr>
|
||||||
>>> print f.as_ul()
|
>>> print f.as_ul()
|
||||||
<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li>
|
<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li>
|
||||||
<li><label for="id_language_0">Language:</label> <ul>
|
<li><label for="id_language_0">Language:</label> <ul>
|
||||||
<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
||||||
<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
||||||
</ul></li>
|
</ul></li>
|
||||||
>>> print f.as_p()
|
>>> print f.as_p()
|
||||||
<p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p>
|
<p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p>
|
||||||
<p><label for="id_language_0">Language:</label> <ul>
|
<p><label for="id_language_0">Language:</label> <ul>
|
||||||
<li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
|
||||||
<li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
|
||||||
</ul></p>
|
</ul></p>
|
||||||
|
|
||||||
MultipleChoiceField is a special case, as its data is required to be a list:
|
MultipleChoiceField is a special case, as its data is required to be a list:
|
||||||
|
@ -535,8 +535,8 @@ zero-based index.
|
||||||
>>> f = SongForm(auto_id='%s_id')
|
>>> f = SongForm(auto_id='%s_id')
|
||||||
>>> print f['composers']
|
>>> print f['composers']
|
||||||
<ul>
|
<ul>
|
||||||
<li><label><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li>
|
<li><label for="composers_id_0"><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li>
|
||||||
<li><label><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li>
|
<li><label for="composers_id_1"><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
Data for a MultipleChoiceField should be a list. QueryDict and MultiValueDict
|
Data for a MultipleChoiceField should be a list. QueryDict and MultiValueDict
|
||||||
|
|
|
@ -40,7 +40,7 @@ Unicode decoding problems...
|
||||||
... somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect(), label=u'\xc5\xf8\xdf')
|
... somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect(), label=u'\xc5\xf8\xdf')
|
||||||
>>> f = SomeForm()
|
>>> f = SomeForm()
|
||||||
>>> f.as_p()
|
>>> f.as_p()
|
||||||
u'<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>'
|
u'<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label for="id_somechoice_0"><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label for="id_somechoice_1"><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label for="id_somechoice_2"><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>'
|
||||||
|
|
||||||
Testing choice validation with UTF-8 bytestrings as input (these are the
|
Testing choice validation with UTF-8 bytestrings as input (these are the
|
||||||
Russian abbreviations "мес." and "шт.".
|
Russian abbreviations "мес." and "шт.".
|
||||||
|
@ -56,7 +56,7 @@ Translated error messages used to be buggy.
|
||||||
>>> activate('ru')
|
>>> activate('ru')
|
||||||
>>> f = SomeForm({})
|
>>> f = SomeForm({})
|
||||||
>>> f.as_p()
|
>>> f.as_p()
|
||||||
u'<ul class="errorlist"><li>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>'
|
u'<ul class="errorlist"><li>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435.</li></ul>\n<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul>\n<li><label for="id_somechoice_0"><input type="radio" id="id_somechoice_0" value="\xc5" name="somechoice" /> En tied\xe4</label></li>\n<li><label for="id_somechoice_1"><input type="radio" id="id_somechoice_1" value="\xf8" name="somechoice" /> Mies</label></li>\n<li><label for="id_somechoice_2"><input type="radio" id="id_somechoice_2" value="\xdf" name="somechoice" /> Nainen</label></li>\n</ul></p>'
|
||||||
>>> deactivate()
|
>>> deactivate()
|
||||||
|
|
||||||
Deep copying translated text shouldn't raise an error
|
Deep copying translated text shouldn't raise an error
|
||||||
|
|
|
@ -741,20 +741,20 @@ u'<ul>\n<li><label><input checked="checked" type="radio" name="email" value="\u0
|
||||||
>>> w = RadioSelect(attrs={'id':'foo'})
|
>>> w = RadioSelect(attrs={'id':'foo'})
|
||||||
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
|
||||||
<ul>
|
<ul>
|
||||||
<li><label><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li>
|
<li><label for="foo_0"><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li>
|
||||||
<li><label><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li>
|
<li><label for="foo_1"><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li>
|
||||||
<li><label><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li>
|
<li><label for="foo_2"><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li>
|
||||||
<li><label><input type="radio" id="foo_3" value="R" name="beatle" /> Ringo</label></li>
|
<li><label for="foo_3"><input type="radio" id="foo_3" value="R" name="beatle" /> Ringo</label></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
# Attributes provided at render-time are passed to the constituent inputs
|
# Attributes provided at render-time are passed to the constituent inputs
|
||||||
>>> w = RadioSelect()
|
>>> w = RadioSelect()
|
||||||
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'})
|
>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'})
|
||||||
<ul>
|
<ul>
|
||||||
<li><label><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li>
|
<li><label for="bar_0"><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li>
|
||||||
<li><label><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li>
|
<li><label for="bar_1"><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li>
|
||||||
<li><label><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li>
|
<li><label for="bar_2"><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li>
|
||||||
<li><label><input type="radio" id="bar_3" value="R" name="beatle" /> Ringo</label></li>
|
<li><label for="bar_3"><input type="radio" id="bar_3" value="R" name="beatle" /> Ringo</label></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
# CheckboxSelectMultiple Widget ###############################################
|
# CheckboxSelectMultiple Widget ###############################################
|
||||||
|
|
Loading…
Reference in New Issue