如何使用所需信息呈现表单字段
Posted
技术标签:
【中文标题】如何使用所需信息呈现表单字段【英文标题】:How to render form field with information that it is required 【发布时间】:2010-11-18 06:00:42 【问题描述】:有没有什么聪明的方法可以让 django 表单在必填字段之后渲染带有星号的字段?或者提供一些其他聪明的方法来标记必填字段?如果我已经在表单中设置了所需的字段,我不想在模板中再次执行此操作。
【问题讨论】:
【参考方案1】:从 Django 1.2 开始,如果您的表单有一个名为 required_css_class
的属性,它将被添加到 BoundField.css_classes
的必填字段。然后,您可以根据需要使用 CSS 设置表单所需部分的样式。一个典型的用例:
# views.py
class MyForm(django.forms.Form):
required_css_class = 'required'
…
…
/* CSS */
th.required font-weight: bold;
…
<!-- html -->
<tr>
<th class="form.name.css_classes">form.name.label_tag</th>
<td>form.name.errorsform.name</td>
</tr>
如果您使用Form.as_table()
、Form.as_ul
和Form.as_p
,它们会自动执行此操作,分别将类添加到<tr>
、<li>
和<p>
。
【讨论】:
请注意,您可以使用 css 内容指令添加星号,使用相同的方法:th.required:after content: '*'
【参考方案2】:
您也可以使用 field.field.required 属性:
% for field in form %
field.label % if field.field.required % * % endif %
field
field.errors
% endfor %
【讨论】:
完美。如果您要遍历表单字段并使用% for field in form %
等单独呈现每个字段,而不是使用 form
呈现整个表单,则需要此解决方案【参考方案3】:
我发现实现此类目的的最佳方法是通过 html 模板呈现表单的输出。如何做到这一点在here 中进行了描述。幸运的是,该示例在必填字段后添加了一个星号,就像您想要的那样。
【讨论】:
我的表单都没有呈现 form ,我明确调用字段,因为我通常只显示表单字段的子集。我需要一些更低的东西,比如字段或小部件的属性。 如果您正在谈论模型表单并使用 Meta 类的“字段”属性来确定要显示的字段子集,这将起作用。如果您有非模型表单并且有隐藏字段,那么它将再次起作用。我很着急,如果我遗漏了什么,抱歉? 我有一个在许多模板中使用的表单,我通常在模板中调用我需要的所有字段。这就是为什么我不能使用模板渲染。但似乎会更好,如果我只是用 Meta 创建了一些子类,然后使用这个模板。这是个好主意,我必须考虑一下。 我正在遍历表单的所有字段,所以这对我来说确实很神奇:)【参考方案4】:我使用模板标签来呈现带有标签和错误的表单字段,以及用于必填字段的星号和 CSS 类。在 www.djangosn-ps.org 上有各种可用的 sn-ps
【讨论】:
我现在也是,我的意思是我使用过滤器来做到这一点。不过,这不是很干。我更愿意将此设置放入表单中(表单中有一些“mark_required=True”)。【参考方案5】:Personny 我尝试过这样的事情,即覆盖默认模板标签(这会在所有管理界面中为必需的非只读字段添加一个红色星号。然后我还为我的视图定义了第二个标签,它混合了内联标签和块标签. 参见下面的代码(复制/粘贴 Django 源代码并进行一些修改):
在 settings.py 中:
from django.forms.util import flatatt
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
import django.forms.forms as django_forms
def custom_label_tag(self, contents=None, attrs=None):
"""
Wraps the given contents in a <label>, if the field has an ID attribute.
Does not HTML-escape the contents. If contents aren't given, uses the
field's HTML-escaped label.
If attrs are given, they're used as HTML attributes on the <label> tag.
"""
contents = contents or conditional_escape(self.label)
widget = self.field.widget
id_ = widget.attrs.get('id') or self.auto_id
if id_:
attrs = attrs and flatatt(attrs) or ''
if self.field.required:
label = unicode(contents)
label_suffix = ""
if label[-1] == ":":
label = label[:-1]
label_suffix += ":"
contents = u'<label for="%s"%s>%s<span style="color:red;">*</span>%s</label>' % (widget.id_for_label(id_), attrs, label, label_suffix)
else:
contents = u'<label for="%s"%s>%s</label>' % (widget.id_for_label(id_), attrs, unicode(contents))
return mark_safe(contents)
def custom_inline_label_tag(self, contents=None, attrs=None):
if attrs:
if "class" in attrs.keys():
attrs["class"] += " inline"
else:
attrs["class"] = "inline"
else:
attrs = "class": "inline"
return self.label_tag(contents, attrs)
django_forms.BoundField.label_tag = custom_label_tag # override django method
django_forms.BoundField.inline_label_tag = custom_inline_label_tag
在我的模板中
<p> form.fieldname.errors form.fieldname.inline_label_tag form.fieldname</p>
OR
<p> form.fieldname.errors form.fieldname.label_tag form.fieldname</p>
【讨论】:
以上是关于如何使用所需信息呈现表单字段的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何在呈现之前但在表单初始化之后修改表单字段的值?
如何在 Django 中修改 Bootstrap 4 表单验证信息呈现方式?