Ticket #4860: 4860.labels-with-fors.diff
File 4860.labels-with-fors.diff, 10.3 KB (added by , 17 years ago) |
---|
-
django/newforms/widgets.py
281 281 self.index = index 282 282 283 283 def __unicode__(self): 284 return mark_safe(u'<label>%s %s</label>' % (self.tag(), 284 if 'id' in self.attrs: 285 for_attr = ' for="%s_%s"' % (self.attrs['id'], self.index) 286 else: 287 for_attr = '' 288 return mark_safe(u'<label%s>%s %s</label>' % (for_attr, self.tag(), 285 289 conditional_escape(force_unicode(self.choice_label)))) 286 290 287 291 def is_checked(self): 288 292 return self.value == self.choice_value 289 293 290 294 def tag(self): 295 final_attrs = dict(self.attrs, type='radio', name=self.name, value=self.choice_value) 291 296 if 'id' in self.attrs: 292 self.attrs['id'] = '%s_%s' % (self.attrs['id'], self.index) 293 final_attrs = dict(self.attrs, type='radio', name=self.name, value=self.choice_value) 297 final_attrs['id'] = '%s_%s' % (self.attrs['id'], self.index) 294 298 if self.is_checked(): 295 299 final_attrs['checked'] = 'checked' 296 300 return mark_safe(u'<input%s />' % flatatt(final_attrs)) … … 364 368 # so that the checkboxes don't all have the same ID attribute. 365 369 if has_id: 366 370 final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) 371 for_attr = ' for="%s_%s"' % (attrs['id'], i) 372 else: 373 for_attr = '' 367 374 cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values) 368 375 option_value = force_unicode(option_value) 369 376 rendered_cb = cb.render(name, option_value) 370 output.append(u'<li><label >%s %s</label></li>' % (rendered_cb,377 output.append(u'<li><label%s>%s %s</label></li>' % (for_attr, rendered_cb, 371 378 conditional_escape(force_unicode(option_label)))) 372 379 output.append(u'</ul>') 373 380 return mark_safe(u'\n'.join(output)) -
tests/regressiontests/forms/regressions.py
40 40 ... somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect(), label=u'\xc5\xf8\xdf') 41 41 >>> f = SomeForm() 42 42 >>> f.as_p() 43 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>'43 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>' 44 44 45 45 Testing choice validation with UTF-8 bytestrings as input (these are the 46 46 Russian abbreviations "мес." and "шт.". … … 56 56 >>> activate('ru') 57 57 >>> f = SomeForm({}) 58 58 >>> f.as_p() 59 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>'59 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>' 60 60 >>> deactivate() 61 61 62 62 Deep copying translated text shouldn't raise an error -
tests/regressiontests/forms/forms.py
424 424 >>> f = FrameworkForm(auto_id='id_%s') 425 425 >>> print f['language'] 426 426 <ul> 427 <li><label ><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>428 <li><label ><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>427 <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 428 <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 429 429 </ul> 430 430 431 431 When RadioSelect is used with auto_id, and the whole form is printed using … … 434 434 >>> print f 435 435 <tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr> 436 436 <tr><th><label for="id_language_0">Language:</label></th><td><ul> 437 <li><label ><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>438 <li><label ><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>437 <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 438 <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 439 439 </ul></td></tr> 440 440 >>> print f.as_ul() 441 441 <li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> 442 442 <li><label for="id_language_0">Language:</label> <ul> 443 <li><label ><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>444 <li><label ><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>443 <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 444 <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 445 445 </ul></li> 446 446 >>> print f.as_p() 447 447 <p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p> 448 448 <p><label for="id_language_0">Language:</label> <ul> 449 <li><label ><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>450 <li><label ><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>449 <li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 450 <li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 451 451 </ul></p> 452 452 453 453 MultipleChoiceField is a special case, as its data is required to be a list: … … 516 516 >>> f = SongForm(auto_id='%s_id') 517 517 >>> print f['composers'] 518 518 <ul> 519 <li><label ><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li>520 <li><label ><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li>519 <li><label for="composers_id_0"><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li> 520 <li><label for="composers_id_1"><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li> 521 521 </ul> 522 522 523 523 Data for a MultipleChoiceField should be a list. QueryDict and MultiValueDict -
tests/regressiontests/forms/widgets.py
741 741 >>> w = RadioSelect(attrs={'id':'foo'}) 742 742 >>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) 743 743 <ul> 744 <li><label ><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li>745 <li><label ><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li>746 <li><label ><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li>747 <li><label ><input type="radio" id="foo_3" value="R" name="beatle" /> Ringo</label></li>744 <li><label for="foo_0"><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li> 745 <li><label for="foo_1"><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li> 746 <li><label for="foo_2"><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li> 747 <li><label for="foo_3"><input type="radio" id="foo_3" value="R" name="beatle" /> Ringo</label></li> 748 748 </ul> 749 749 750 750 # Attributes provided at render-time are passed to the constituent inputs 751 751 >>> w = RadioSelect() 752 752 >>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'}) 753 753 <ul> 754 <li><label ><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li>755 <li><label ><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li>756 <li><label ><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li>757 <li><label ><input type="radio" id="bar_3" value="R" name="beatle" /> Ringo</label></li>754 <li><label for="bar_0"><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li> 755 <li><label for="bar_1"><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li> 756 <li><label for="bar_2"><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li> 757 <li><label for="bar_3"><input type="radio" id="bar_3" value="R" name="beatle" /> Ringo</label></li> 758 758 </ul> 759 759 760 760 # CheckboxSelectMultiple Widget ###############################################