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

时间:2009-08-10 10:03:28

标签: django forms field

是否有任何聪明的方法可以在需要的字段之后使用星号制作django表单渲染字段?或者提供一些其他聪明的标记必填字段?如果我已经在表单中设置了一个字段,我不想在模板中再次这样做。

5 个答案:

答案 0 :(得分:30)

从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,他们会自动执行此操作,将课程添加到<tr><li>和{{1分别。

答案 1 :(得分:5)

您还可以使用field.field.required属性:

{% for field in form %}
  {{field.label}} {% if field.field.required %} * {% endif %}
  {{field}}
  {{field.errors}}
{% endfor %}

答案 2 :(得分:1)

我发现这种目的的最佳方法是通过html模板渲染表单的输出。如何做到这一点描述here。幸运的是,该示例在您需要的字段之后添加了一个星号。

答案 3 :(得分:1)

我使用模板标记来呈现带有标签和错误的表单字段,以及用于必填字段的星号和CSS类。 www.djangosnippets.org上有各种各样的片段可供选择。

答案 4 :(得分:0)

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>