如何在 Django 中呈现单个单选按钮选项?

Posted

技术标签:

【中文标题】如何在 Django 中呈现单个单选按钮选项?【英文标题】:How to render individual radio button choices in Django? 【发布时间】:2012-05-01 12:03:42 【问题描述】:

如果我的模型包含带有 Radioselect 小部件的 ChoiceField,如何在模板中单独呈现单选按钮?

假设我正在构建一个网络应用程序,该应用程序允许公司的新员工选择他们想要的桌面计算机类型。这是相关模型:

class ComputerOrder(forms.Form):
    name = forms.CharField(max_length=50)
    office_address = forms.Charfield(max_length=75)
    pc_type = forms.ChoiceField(widget=RadioSelect(), choices=[(1, 'Mac'), (2, 'PC')])

在模板上,如何呈现 Mac 选择按钮?如果我这样做,它会呈现所有选择:

 form.pc_type  

我有点天真地尝试了这个,但它没有产生任何输出:

 form.pc_type.0 

(我在 SO 上发现了一些类似的问题:

In a Django form, how do I render a radio button so that the choices are separated on the page?Django Forms: How to iterate over a Choices of a field in Django form

但我不觉得他们有好的答案。有没有办法让老问题复活?)

【问题讨论】:

感谢提问 【参考方案1】:

Django 1.4+ allows you to iterate 在RadioSelect 中的选项,以及

% for choice in form.pc_type %
   choice.choice_label 
  <span class="radio"> choice.tag </span>
% endfor %

我不确定此更改是否允许您使用您描述的语法 ( form.pc_type.0 ) — 如果没有,您可以使用上面的 for 循环和类似 % if forloop.counter0 == 0 % 的标签来解决此限制。

如果您绑定到 Django render() 方法,或者使用稍微更详细但不太复杂的选项在模板中自己构建表单字段:

 % for choice in form.pc_type.field.choices %
   <input name=' form.pc_type.name ' 
     id=' form.pc_type.auto_id _ forloop.counter0 ' type='radio' value=' choice.0 '
     % if not form.is_bound %% ifequal form.pc_type.field.initial choice.0 % checked='checked' % endifequal %
   % else %% ifequal form.pc_type.data choice.0 % checked='checked' % endifequal %% endif %/>
   <label for=' form.pc_type.auto_id _ forloop.counter0 '> choice.1 </label>
 % endfor %

choice.0choice.1choices 双元组中的第一项和第二项)

【讨论】:

choice.1 必须是 choice.1 很棒的解决方案:D 感谢指正!请记住,您始终可以通过单击某人答案下的“编辑”来直接建议编辑:)【参考方案2】:

单个无线电输入的呈现由RadioSelect 小部件的render 方法处理。如果您想要不同的渲染,子类RadioSelect,相应地更改render 方法,然后使用您的子类作为字段的小部件。

【讨论】:

【参考方案3】:

我认为只需查看选项字段的 for 循环中可用的内容就可以告诉人们他们需要知道什么。例如,我需要该值来设置围绕选项范围的类(用于颜色等):

<div>
    % for radio_input in form.role %
        # Skip the empty value #
        % if radio_input.choice_value %
            <span class="user-level  radio_input.choice_value "> radio_input </span>
        % endif %
    % endfor %
</div>

您可以看到有几个属性使您不必使用序数。

【讨论】:

【参考方案4】:

在 Django 2.0+ 中,您可以继承 forms.RadioSelect 并“简单地”指定用于渲染无线电字段的模板:

class SlimRadioSelect(forms.RadioSelect):
    template_name = 'includes/slim_radio.html'

其中slim_radio.html 包含default RadioSelect widget 使用的template_nameoption_template_name 组合的修订版本。

请注意,默认的 RadioSelect 小部件模板是低级渲染,由多层模板组成:包含、条件和循环逻辑标签比比皆是。

当您在packages/django/forms/templates/django/forms/widgets/input.html 中挖掘以获取您需要的东西时,您就会知道您已经到了。

覆盖默认小部件模板的另一个奇怪之处是,您必须在项目通常可访问的模板路径中调用 TemplatesSetting 渲染器或您的子类 won't be able to find slim_radio.html

要覆盖 RadioSelect 的仅本地模板路径查找:

    'django.forms' 添加到您的INSTALLED_APPS

    FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' 添加到您的settings.py.

这一切似乎比它应该做的要难,但那是框架。祝你好运。

【讨论】:

以上是关于如何在 Django 中呈现单个单选按钮选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据在模型级别定义的枚举字段在 Django Modelform 中呈现单选按钮选择?

Django BooleanField 作为单选按钮?

如何在 Django 中自定义单选按钮

禁用分组单选操作按钮中的单个单选选项

禁用分组单选操作按钮中的单个单选选项

使用 django 和引导类创建单选表单的问题