【问题标题】:How to change Django NullBooleanField widget application wide?如何更改 Django NullBooleanField 小部件应用程序范围?
【发布时间】:2010-08-23 19:58:15
【问题描述】:

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

以下模板或类似的东西将是理想的。只是为了让丰富的样式和语气不同于简单的“是/否/未知”。

'''<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
    )

【问题讨论】:

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


【解决方案1】:

最后我发现即使我有很多NullBooleanFields,将小部件一个一个设置为RadioSelect 的代码也更少。由RadioSelect 生成的&lt;ul&gt; 小部件具有足够的结构来设置样式,即使它需要CSS3 选择器。

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

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

【讨论】:

  • 这是一种比较粗暴的方式,但是你可以创建自己的ModelField,它只覆盖formfield方法。此表单域再次使用您自己的小部件进行自定义。这样您就不必调整任何表格。
【解决方案2】:

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

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))

似乎对我有用,虽然我想知道我做错了什么。

【讨论】:

  • 我最终继承了 NullBooleanField。
猜你喜欢
  • 2012-08-26
  • 2012-06-19
  • 2016-12-12
  • 1970-01-01
  • 2011-11-23
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多