如何为TypedChoiceField的<ul>设置类?</ul>

时间:2012-12-04 13:59:03

标签: django django-forms

我正在使用TypedChoiceField窗口小部件呈现RadioSelect。为窗口小部件设置attrs={'class':'radio'},此类将应用于<input>,但此输入嵌套在<ul>中。我想为这个<ul>设置一个类,我应该在哪里这样做?

我目前仍然使用Django 1.3,因此RadioSelect不是一个选项。

从我的表格:

yesno = forms.TypedChoiceField(
               coerce=lambda x: True if x == 'Yes' else False,
               choices=((False, 'No'), (True, 'Yes')),
               widget=forms.RadioSelect)

实际的HTML:

<ul>
<li>
  <label for="yesno_0">
    <input value="False" type="radio" name="yesno" id="yesno_0"> 
    No
  </label>
</li>
<li>
  <label for="yesno_1">
    <input name="yesno" value="True" id="yesno_1" type="radio"> 
    Yes
  </label>
</li>
</ul>

我想要的是什么:

<ul class='myclass'>
<li>
  <label for="yesno_0">
...

1 个答案:

答案 0 :(得分:2)

我看到的最简单的方式: 您可以创建一个自定义的RadioSelect小部件,继承自widgets.RadioSelect并覆盖“renderer”属性并将其设置为您的自定义RadioFieldRenderer(也继承自widgets.RadioFieldRenderer)并覆盖“render”方法

class CustomRadioFieldRenderer(widgets.RadioFieldRenderer):
    def render(self):
        return mark_safe(u'<ul class="YOUR-CLASS-HERE">\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>'
            % force_unicode(w) for w in self]))


class CustomRadioSelect(widgets.RadioSelect):
    renderer = CustomRadioFieldRenderer


yesno = forms.TypedChoiceField(widget=CustomRadioSelect, *args, **kwargs)

或者使用render致电super(),然后将<ul>替换为<ul class=''>,这是一个细节