Подтвердить что ты не робот

Как визуализировать поле формы с необходимой информацией

Есть ли какой-нибудь умный способ сделать поле рендеринга django, со звездочками, после полей, которые требуются? Или предоставить некоторые другие умные, чтобы отметить обязательные поля? Я не хотел бы повторять это в шаблоне, если я уже установил поле, как требуется в форме.

4b9b3361

Ответ 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>