如何更改Django NullBooleanField小部件应用程序?

时间:2010-08-23 19:58:16

标签: django-forms radio-button boolean django-widget

我想在我的应用程序中显示所有NullBooleanFields作为单选按钮。最好的方法是什么?

以下模板或类似的东西是理想的。只是为了让丰富的造型和语调与普通的“是/否/未知”不同。

'''<li class="field-%s">
    <label class="%s" title="%s">%s</label>
    <label class="y"><input type="radio" name="%s" value="1" %s /> %s</label>
    <label class="n"><input type="radio" name="%s" value="0" %s /> %s</label>
    <label class="e"><input type="radio" name="%s" value=""  %s /> %s</label>
    </li>
''' % (
        field,
        field, help text, verbose_name,
        field, y, y_label,
        field, n, n_label,
        field, e, e_label
    )

2 个答案:

答案 0 :(得分:2)

最后,我认为即使我有很多RadioSelect,将窗口小部件逐个设置为NullBooleanFields也是代码较少。 <ul>小部件生成的RadioSelect足够结构化,即使它需要CSS3选择器。

不干,但不那么麻烦。一个人需要务实并继续前进。

如果有人可以在forms.py级别提供代码以将NullBooleanField的默认小部件从NullBooleanSelect更改为RadioSelect,我很乐意接受答案。

答案 1 :(得分:1)

我刚刚实现了一个自定义小部件来执行此操作:

class YesNoNARadioSelect(widgets.Widget):
    CHOICES=((True,'Yes'),(False,'No'),(None,'N/A'))

    def render(self,name,value,attrs=None):
        s=[]
        for c in self.CHOICES:
            extraAttrs=attrs.copy()
            extraAttrs.update(dict(type='radio',name=name,value=c[0]))
            if value==c[0]: extraAttrs['checked']='checked'
            extraAttrs=self.build_attrs(extraAttrs)
            s.append(format_html('<label><input {}/>{}</label>',flatatt(extraAttrs),c[1]))
        return S(''.join(s))

似乎对我有用,虽然我想听到任何我做错的事。