【发布时间】:2013-06-18 19:45:31
【问题描述】:
在阅读Docs 并使用 Django 表单很长一段时间后,我认为模板中的{{ form.as_p }} 将呈现 Django 表单似乎很标准。不过,我的情况有点不同。
我的表单中有 2 个复选框:
class FORM(forms.Form):
field_a = forms.BooleanField(initial=False, label =('FIELD-A'))
field_b= forms.BooleanField(initial=True, label=('FIELD-B'))
我像大多数人一样从视图中传递表单对象:
context = {
'FORM':FORM(),
}
return render_to_string(template, context)
我正在尝试使用基本的“如果”逻辑来查看是否应该显示一个或两个字段。我知道大多数人会说“只需将它们命名为两个单独的表格”,但出于组织目的,我更愿意将它们保留为一个表格。
问题
{% if BoolValue' %}
<form action='' method='post'>
{{ FORM.field_a }}
</form>
{% endif %}
这只会返回字段,而不是字段标签(所以只是一个复选框)。离开 Docs 和其他 StackOverflow Questions,这应该显示整个表单,包括标签,但它没有。
不过,这些方法仍然有效:
方法一
{% for field in FORM%}
<div class="form">
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
这将显示两个表单及其各自的标签和字段输入(复选框)
方法二
{{ FORM.as_p }}
呈现整个表单的传统方式将同时显示字段和标签,它在样式和格式上与方法 1 几乎相同。
编辑 方法 3
{{ FORM.field_a.label_tag }} {{ Form.field_a }}
这将显示标签和表单域。一种可能的解决方法,但我正在寻找为什么 {{ Form.field_a }} 不能自行工作
所以...
为什么我不能使用其各自的标签呈现该单独的表单? 可以这么说,我不是在寻找解决方法,因为我希望两个字段都在一个表单下。有什么想法吗?
【问题讨论】:
-
你试过
{{ FORM.field_a }} {{FORM.field_a.label_tag}}吗?有效吗? -
已确认。上述方法确实有效。
-
我会把它作为答案:D
-
这是正常的记录行为。请参阅表单文档的“循环遍历表单字段”部分:docs.djangoproject.com/en/1.5/topics/forms/…。呈现的表单字段就是这样 - 字段本身,而不是它的任何支持属性,如标签、帮助文本或错误。所有这些都可以通过记录的属性获得。
-
您实际上不必迭代 - 您可以按名称访问字段,如在您接受的答案中,或通过在该链接中迭代
form.fields。关键是给定一个字段对象,无论是来自迭代还是来自命名访问,您都可以使用它的属性,例如label_tag。
标签: django django-forms django-templates