Я немного покопался и нашел ответ в этом подобном посте , который указывает на несколько устаревший пост в 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 развивается.Это нарушает DRY, копируя код из as_widget ().(TBH, я не нашел времени, чтобы полностью понять код из as_widget) Я использую его только как временный взлом.Возможно, есть лучший способ, который использует пользовательские теги шаблонов.Если это так, пожалуйста, дайте мне знать.