Django

Code

Ticket #4117: widget-ul-id.2.diff

File widget-ul-id.2.diff, 8.3 kB (added by Alex, 5 months ago)

Same patch, just updated to apply against forms

  • a/django/forms/widgets.py

    old new  
    321321 
    322322    def render(self): 
    323323        """Outputs a <ul> for this set of radio fields.""" 
    324         return mark_safe(u'<ul>\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>' 
    325                 % force_unicode(w) for w in self])) 
     324        att = {} 
     325        id_ = self.attrs.get('id') 
     326        if id_: 
     327            att['id'] = id_ 
     328        return mark_safe(u'<ul%s>\n%s\n</ul>' % (flatatt(att), u'\n'.join([u'<li>%s</li>' 
     329                % force_unicode(w) for w in self]))) 
    326330 
    327331class RadioSelect(Select): 
    328332    renderer = RadioFieldRenderer 
     
    360364        if value is None: value = [] 
    361365        has_id = attrs and 'id' in attrs 
    362366        final_attrs = self.build_attrs(attrs, name=name) 
    363         output = [u'<ul>'] 
     367        att = {} 
     368        id_ = final_attrs.get('id') 
     369        if id_: 
     370            att['id'] = id_ 
     371        output = [u'<ul%s>' % flatatt(att)] 
    364372        # Normalize to strings 
    365373        str_values = set([force_unicode(v) for v in value]) 
    366374        for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): 
  • a/tests/regressiontests/forms/forms.py

    old new  
    442442zero-based index. 
    443443>>> f = FrameworkForm(auto_id='id_%s') 
    444444>>> print f['language'] 
    445 <ul
     445<ul id="id_language"
    446446<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    447447<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    448448</ul> 
     
    452452ID of the *first* radio button. 
    453453>>> print f 
    454454<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" id="id_name" /></td></tr> 
    455 <tr><th><label for="id_language_0">Language:</label></th><td><ul
     455<tr><th><label for="id_language_0">Language:</label></th><td><ul id="id_language"
    456456<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    457457<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    458458</ul></td></tr> 
    459459>>> print f.as_ul() 
    460460<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li> 
    461 <li><label for="id_language_0">Language:</label> <ul
     461<li><label for="id_language_0">Language:</label> <ul id="id_language"
    462462<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    463463<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    464464</ul></li> 
    465465>>> print f.as_p() 
    466466<p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p> 
    467 <p><label for="id_language_0">Language:</label> <ul
     467<p><label for="id_language_0">Language:</label> <ul id="id_language"
    468468<li><label for="id_language_0"><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li> 
    469469<li><label for="id_language_1"><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li> 
    470470</ul></p> 
     
    534534zero-based index. 
    535535>>> f = SongForm(auto_id='%s_id') 
    536536>>> print f['composers'] 
    537 <ul
     537<ul id="composers_id"
    538538<li><label for="composers_id_0"><input type="checkbox" name="composers" value="J" id="composers_id_0" /> John Lennon</label></li> 
    539539<li><label for="composers_id_1"><input type="checkbox" name="composers" value="P" id="composers_id_1" /> Paul McCartney</label></li> 
    540540</ul> 
  • a/tests/regressiontests/forms/regressions.py

    old new  
    4040...     somechoice = ChoiceField(choices=GENDERS, widget=RadioSelect(), label=u'\xc5\xf8\xdf') 
    4141>>> f = SomeForm() 
    4242>>> f.as_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>' 
     43u'<p><label for="id_somechoice_0">\xc5\xf8\xdf:</label> <ul id="id_somechoice">\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>' 
    4444 
    4545Testing choice validation with UTF-8 bytestrings as input (these are the 
    4646Russian abbreviations "мес." and "шт.". 
     
    5656>>> activate('ru') 
    5757>>> f = SomeForm({}) 
    5858>>> 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 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>' 
     59u'<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 id="id_somechoice">\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>' 
    6060>>> deactivate() 
    6161 
    6262Deep copying translated text shouldn't raise an error 
  • a/tests/regressiontests/forms/widgets.py

    old new  
    740740# Attributes provided at instantiation are passed to the constituent inputs 
    741741>>> w = RadioSelect(attrs={'id':'foo'}) 
    742742>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) 
    743 <ul
     743<ul id="foo"
    744744<li><label for="foo_0"><input checked="checked" type="radio" id="foo_0" value="J" name="beatle" /> John</label></li> 
    745745<li><label for="foo_1"><input type="radio" id="foo_1" value="P" name="beatle" /> Paul</label></li> 
    746746<li><label for="foo_2"><input type="radio" id="foo_2" value="G" name="beatle" /> George</label></li> 
     
    750750# Attributes provided at render-time are passed to the constituent inputs 
    751751>>> w = RadioSelect() 
    752752>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')), attrs={'id':'bar'}) 
    753 <ul
     753<ul id="bar"
    754754<li><label for="bar_0"><input checked="checked" type="radio" id="bar_0" value="J" name="beatle" /> John</label></li> 
    755755<li><label for="bar_1"><input type="radio" id="bar_1" value="P" name="beatle" /> Paul</label></li> 
    756756<li><label for="bar_2"><input type="radio" id="bar_2" value="G" name="beatle" /> George</label></li>