Есть ли какой-нибудь умный способ сделать поле рендеринга 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.errors}}{{form.name}}</td>
</tr>
Если вы используете Form.as_table()
, Form.as_ul
и Form.as_p
, они делают это автоматически, добавляя класс к <tr>
, <li>
и <p>
соответственно.
Ответ 2
Вы также можете использовать свойство field.field.required:
{% for field in form %}
{{field.label}} {% if field.field.required %} * {% endif %}
{{field}}
{{field.errors}}
{% endfor %}
Ответ 3
Лучший способ для таких целей, который я нашел, - сделать вывод формы через шаблон html. Как это сделать описано здесь. К счастью, пример ставит звездочку после необходимых полей так, как вы хотите.
Ответ 4
Я использую тег шаблона для визуализации полей формы с их метками и ошибками, плюс звездочку и класс CSS для обязательных полей. Для этого доступны различные фрагменты на www.djangosnippets.org
Ответ 5
Лично я пробовал что-то вроде этого, т.е. переопределяя тег шаблона по умолчанию (это добавляет красную звездочку во весь интерфейс администратора для требуемых полей не-readonly. Затем я также определил 2-й тег для моих представлений, которые смешивают встроенные и блокирующие метки См. Приведенный ниже код (копирование/вставка исходного кода 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 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>