Ошибки формы вывода Django в виде строк таблицы в {{form.as_table}} - PullRequest
5 голосов
/ 16 апреля 2011

Я действительно считаю, что ярлыки вывода формы, такие как as_table, очень удобны. Тем не менее, отображение ошибок при использовании этих методов мне кажется немного нелогичным. Когда я использую формат as_table, я бы хотел, чтобы ошибки, связанные с полем, отображались в соответствии с форматированием таблицы. Я могу вручную собрать свои формы так:

<table>
{% for error in form.non_field_errors %}
<tr><td>{{ error }}</td></tr>
{% endfor %}
{% endif %}

{% if form.username.errors %}
{% for error in form.username.errors %}
<tr><td>{{ error }}</td></tr>
{% endfor %}
{% endif %}
<tr><th><label for="id_username">Name:</label></th><td>{{ form.username }}</td></td>

{% if form.password.errors %}
{% for error in form.password.errors %}
<tr><td>{{ error }}</td></tr>
{% endfor %}
{% endif %}
<tr><th><label for="id_password">Password:</label>/th><td>{{ form.password }}</td></td>

Но что я хочу знать, так это то, что если есть более простой способ сделать это? Может быть, что-то я пропустил в документах? Или, может быть, другой метод, который вы используете?

1 Ответ

10 голосов
/ 16 апреля 2011

How errors are displayed и настройка формата списка ошибок показывают, что представляет собой вывод поля ошибки по умолчанию и как его настроить.

Я недавно использовал reusable template в своих проектах, что хорошо для меня работает.

table_form.html:

<table>
{% for error in form.non_field_errors %}
    <tr><td>{{ error }}</td></tr>
{% endfor %}

{% for field in form %}
    {% for error in form.username.errors %}
    <tr><td>{{ error }}</td></tr>
    {% endfor %}
    <tr><th>{{ field.label_tag }}:</th><td>{{ field }}</td></td>
{% endfor %}
</table>

template.html:

<form>
    {% include 'table_form.html' %}
</form>

работает также несколько форм, например просмотр с контекстом, включая form1 и form2:

template.html:

<form>
    {% include 'table_form.html with form=form1 %}
</form>

<form>
    {% include 'table_form.html with form=form2 %}
</form>

редактирование:

Вот метод as_table, как определено в классе BaseForm:

210     def as_table(self):
211         "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
212         return self._html_output(
213             normal_row = u'<tr%(html_class_attr)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>',
214             error_row = u'<tr><td colspan="2">%s</td></tr>',
215             row_ender = u'</td></tr>',
216             help_text_html = u'<br /><span class="helptext">%s</span>',
217             errors_on_separate_row = False)

переопределение этого метода в вашей форме позволит вам изменить рендеринг при использовании {{form.as_table}}

...