Как отобразить поле формы с информацией, которая требуется - PullRequest
21 голосов
/ 10 августа 2009

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

Ответы [ 5 ]

30 голосов
/ 28 декабря 2010

Начиная с 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> соответственно.

5 голосов
/ 27 января 2015

Вы также можете использовать свойство field.field.required:

{% for field in form %}
  {{field.label}} {% if field.field.required %} * {% endif %}
  {{field}}
  {{field.errors}}
{% endfor %}
1 голос
/ 10 августа 2009

Я использую тег шаблона для отображения полей формы с их метками и ошибками, а также звездочкой и классом CSS для обязательных полей. Для этого на сайте www.djangosnippets.org доступны различные фрагменты.

1 голос
/ 10 августа 2009

Лучший способ для таких целей, которые я нашел, - визуализация вывода формы через HTML-шаблон. Как это сделать, описано здесь . К счастью, этот пример ставит звездочку после обязательных полей так, как вы хотите.

0 голосов
/ 22 марта 2013

Personny Я попробовал что-то вроде этого, то есть переопределил тег шаблона по умолчанию (это добавляет красную звездочку во весь интерфейс администратора для обязательных полей, не доступных для чтения. Затем я также определил 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'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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...