【问题标题】:How to render form field with information that it is required如何使用所需信息呈现表单字段
【发布时间】:2010-11-18 06:00:42
【问题描述】:

有没有什么聪明的方法可以让 django 表单在必填字段之后渲染带有星号的字段?或者提供一些其他聪明的方法来标记必填字段?如果我已经在表单中设置了所需的字段,我不想在模板中再次执行此操作。

【问题讨论】:

    标签: django forms field


    【解决方案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.errors}}{{form.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>
    

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多