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