将收音机转换为选择

时间:2016-01-28 23:23:45

标签: django django-forms

我自己创建了这样的FieldRenderer:

class BootstrapRadioFieldRenderer(ChoiceFieldRenderer):
    outer_html = '<span {id_attr}>{content}</span>'
    inner_html = '<div class="radio">{choice_value}{sub_widgets}</div>'
    choice_input_class = RadioChoiceInput


class BootstrapRadioSelect(RendererMixin, Select):
    renderer = BootstrapRadioFieldRenderer
    _empty_value = ''

正如您所见,它基于RadioChoiceInput,它输出一个Radio元素。我想改变它以输出一个简单的“选择”元素。怎么做?

(当然我已尝试按RadioChoiceInput更改Select并获得__init__() takes at most 3 arguments (6 given)

2 个答案:

答案 0 :(得分:1)

我不知道我有什么问题......因为答案很简单。

我没有触摸我的模型。在我的所有形式中,我都有这样的事情:

a = _(u'Statut:')
statut = forms.TypedChoiceField(
    label=a, required=False,
    choices=[(k, Personne.TAB_STATUT[k])
             for k in Personne.TAB_STATUT],
    widget=BootstrapRadioSelect(attrs={
        'title': a,
    }),
    error_messages=e)

我只需要改变它们:“回到经典”:

statut = forms.CharField(
    label=a, required=False,
    widget=forms.Select(attrs={
        'title': a,
        'class': 'form-control'},
        choices=[(k, Personne.TAB_STATUT[k])
                 for k in Personne.TAB_STATUT],),
    error_messages=e)

它就像一个魅力。

答案 1 :(得分:0)

ChoiceFieldRenderer意味着

  

RadioSelect使用的对象,用于启用无线电小部件的自定义。

但是,它似乎不适用于自定义Select小部件。

为此,我建议您将the Select widget作为子类并覆盖它的渲染方法,如described in docs

或者,如果您真的想要,您可以定义自己的SelectRenderer,然后迭代self.choices小部件并按照您的意愿呈现它们。

如果在定义窗口小部件的其他子类时需要更多的灵活性(仅修改渲染),这将非常有用;我可以想象其他Django用户也会受益于这种通用&#34;渲染自定义&#34;,所以请随意在the django-developers mailing list中讨论这个功能。