我做了一点挖掘,并在thissimilar post的答案中找到了一个线索,该帖子指向django-users中有点过时的帖子。
从中的as_widget()方法中借用一些代码forms.py我创建了一个方法,我可以添加到我的表单中,以便检索RadioSelect小部件呈现为HTML的选择。
class MyForm(forms.Form):
MY_CHOICES = (
('opt0', 'Option zero'),
('opt1', 'Option one'),
)
myfield = forms.ChoiceField(widget=forms.RadioSelect, choices=MY_CHOICES)
def myfield_choices(self):
"""
Returns myfield's widget's default renderer, which can be used to
render the choices of a RadioSelect widget.
"""
field = self['myfield']
widget = field.field.widget
attrs = {}
auto_id = field.auto_id
if auto_id and 'id' not in widget.attrs:
attrs['id'] = auto_id
name = field.html_name
return widget.get_renderer(name, field.value(), attrs=attrs)
然后在模板中,您可以访问单个单选按钮选择,如下所示:
<ul>
<li>
{{ myform.myfield_choices.0 }}
My custom HTML that goes with choice 0
</li>
<li>
{{ myform.myfield_choices.1 }}
Different HTML that goes with choice 1
</li>
</ul>
或
{% for choice in myform.myfield_choices %}
<div>
{{ choice }}
</div>
{% endfor %}
我很确定这是个坏主意。 随着django的发展,它可能会在某个时候停止工作。 它通过从as_widget()复制代码来违反DRY。 (TBH,我没有花时间完全理解as_widget的代码)我只将其用作临时黑客。 也许有一个更好的方法,涉及自定义模板标签。 如果是这样,请告诉我。
RadioSelect控件将默认将其输出呈现为无序列表。
会输出:
这将使每个无线电选择在自己的线路上. 你可能需要添加一些CSS来获得你想要的渲染方式,但这应该得到你需要的结构。 当然,你可以用手工快速编写HTML...
...但我更喜欢手工编写我的HTML。