Zrobiłem małe kopanie i znalazłem ołowiu w odpowiedzi na ten , który wskazuje na nieco przestarzałe post in django-users.
Pożyczanie kodu z metody as_widget() w forms.py Stworzyłem metodę, którą mógłbym dodać do mojego formularza, aby pobrać opcje widżetu RadioSelect wykonane jako 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)
Następnie w szablonie można uzyskać dostęp do indywidualnych wyborów przycisk radiowy tak:
<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>
lub
{% for choice in myform.myfield_choices %}
<div>
{{ choice }}
</div>
{% endfor %}
Jestem całkiem pewien, że to zły pomysł. Prawdopodobnie przestanie działać w pewnym momencie, gdy django ewoluuje. Narusza DRY, kopiując kod z as_widget(). (TBH, nie poświęcałem czasu na pełne zrozumienie kodu z as_widget) Używam go jako tymczasowego hackowania. Być może istnieje lepszy sposób, który obejmuje niestandardowe tagi szablonów. Jeśli tak, proszę dać mi znać.
Ale to nadal drukuje dwie opcje na sąsiednich liniach, prawda? To nie jest to, co próbuję zrobić. Chcę, aby dwa przyciski opcji były szeroko rozdzielone, z blokami pól pod każdym z nich, tak jak w przykładzie "nascar/opera". –
Jeśli piszesz HTML ręcznie, możesz umieścić dodatkowe pola lub znaczniki tam, gdzie chcesz. użycie form.as_ul ograniczy to, co możesz zrobić. – Brandon
Jaka jest składnia do renderowania pojedynczego wyboru elementu przycisku wyboru z wieloma opcjami wyboru? ** {{form.preferred_drink}} ** wyświetla wszystkie opcje. –