Joh*_*don 8 forms django radio-button
我有一个带有双选单选按钮元素的Django表单.我希望表单呈现或多或少像这样:
( ) I prefer beer
The last sporting event I attended was: [ ]
My favorite NASCAR driver is: [ ]
( ) I prefer wine
The last opera/play I attended was: [ ]
My favorite author is: [ ]
换句话说,我想分开两个单选按钮选项.我怎么做?使用默认的form.as_table渲染,选项彼此相邻,我不想要.
(向NASCAR和歌剧爱好者道歉.)
我做了一点挖掘,并找到了这个类似帖子的答案的主角,指向django-users中有点过时的帖子.
从as_widget()方法借用一些代码forms.py我塑造我可以添加到我的形式,以便检索呈现为HTML的RadioSelect部件的选择的方法.
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)
Run Code Online (Sandbox Code Playgroud)
然后在模板中,您可以访问单个单选按钮选项,如下所示:
<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>
Run Code Online (Sandbox Code Playgroud)
要么
{% for choice in myform.myfield_choices %}
<div>
{{ choice }}
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我很确定这是一个坏主意.随着django的发展,它可能会在某些时候停止工作.它通过从as_widget()复制代码来违反DRY.(TBH,我没有花时间完全理解as_widget中的代码)我只是将它用作临时黑客.也许有一种更好的方法涉及自定义模板标签.如果是的话,请告诉我.
默认情况下,RadioSelect 小部件会将其输出呈现为无序列表。
#forms.py
BEER = 0
WINE = 1
PREFERRED_DRINK_CHOICES = (
(BEER, 'Beer'),
(WINE, 'Wine'),
)
class DrinkForm(forms.Form):
preferred_drink = forms.ChoiceField(choices=PREFERRED_DRINK_CHOICES,
widget=forms.RadioSelect())
#views.py
def test(request):
form = DrinkForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
print 'form was valid'
return render_to_response('test.html', {'form' : form},
context_instance=RequestContext(request))
#test.html
<form action="." method="post" enctype="multipart/form-data">
<ul>
<li>
{{ form.name.label_tag }}
{{ form.name }}
{{ form.name.errors }}
</li>
<li>
{{ form.email.label_tag }}
{{ form.email }}
{{ form.email.errors }}
</li>
<li>
{{ form.preferred_drink.label_tag }}
{{ form.preferred_drink }}
{{ form.preferred_drink.errors }}
</li>
<li>
<input type="submit" value="Submit" />
</li>
</ul>
</form>
Run Code Online (Sandbox Code Playgroud)
将输出:
<form enctype="multipart/form-data" method="post" action=".">
<ul>
<li>
<label for="id_name">Name</label>
<input type="text" maxlength="50" name="name" id="id_name">
</li>
<li>
<label for="id_email">Email</label>
<input type="text" id="id_email" name="email">
</li>
<li>
<label for="id_preferred_drink_0">Preferred drink</label>
<ul>
<li>
<label for="id_preferred_drink_0">
<input type="radio" name="preferred_drink" value="0" id="id_preferred_drink_0"> Beer</label>
</li>
<li>
<label for="id_preferred_drink_1"><input type="radio" name="preferred_drink" value="1" id="id_preferred_drink_1"> Wine</label>
</li>
</ul>
</li>
<li>
<input type="submit" value="Submit">
</li>
</ul>
</form>
Run Code Online (Sandbox Code Playgroud)
这将使每个无线电选择都在其自己的线路上。您可能需要添加一些 CSS 才能按照您想要的方式进行渲染,但这应该会获得您需要的结构。当然,您可以通过手动编写 HTML 来简化操作...
<form action="." method="post">
<ul>
{{ form.as_ul }}
<li>
<input type="submit" value="Submit" />
</li>
</ul>
</form>
Run Code Online (Sandbox Code Playgroud)
...但我更喜欢手动编写 HTML。
| 归档时间: |
|
| 查看次数: |
17948 次 |
| 最近记录: |