如何使用所需信息呈现表单字段

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_ulForm.as_p,它们会自动执行此操作,分别将类添加到&lt;tr&gt;&lt;li&gt;&lt;p&gt;

【讨论】:

请注意,您可以使用 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:如何在呈现之前但在表单初始化之后修改表单字段的值?

如何在 Django 中修改 Bootstrap 4 表单验证信息呈现方式?

如何检查表单字段中是不是有呈现控制器的树枝模板中的数据

Django:引导输入组未使用表单呈现所需的 HTML/CSS

如何在 Odoo 中呈现表单视图模型的 Many2one 字段?