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

Редактирование Django _form.as_p

По умолчанию _form.as._p выплевывает:

<p><label for="id_subject">Subject:</label>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>

В то время как мне нужно

 <p><label for="id_subject">Subject:</label><p>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>

с разрывом между меткой и входом. Как я могу изменить свой код Django для этого?

4b9b3361

Ответ 1

Вы просто просто не можете использовать form.as_p больше. Если настройки по умолчанию не работают для вас, вы должны визуализировать их вручную:

<form action="/contact/" method="post">
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p>
</form>

Смотрите документы: https://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields

Ответ 2

Если вам просто нужен перерыв, тогда нет необходимости менять код Django. Просто используйте CSS для стиля label как display: block.

Ответ 3

Переопределите as_p в классе формы.

class MyForm(forms.Form):
    def as_p(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = u'<p%(html_class_attr)s>%(label)s</p> %(field)s%(help_text)s',
            error_row = u'%s',
            row_ender = '</p>',
            help_text_html = u' <span class="helptext">%s</span>',
            errors_on_separate_row = True)

Ответ 4

Довольно то, что описывает Брайан выше. Я бы написал новый метод для вашей формы, например as_myp. Я сделал это для себя. Я взял метод as_table и сделал as_plain для удаления tr/th разметки. Пример.

class MyForm(forms.Form):
    my_field1 = forms.CharField(...)
    my_field2 = forms.WhateverField(...)

    def as_myp(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = '<p%(html_class_attr)s>%(label)s</p> <p>%(field)s%(help_text)s</p>',
            error_row = '%s',
            row_ender = '</p>',
            help_text_html = ' <span class="helptext">%s</span>',
            errors_on_separate_row = True)

    def as_plain(self):
        "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
        return self._html_output(
            normal_row = '%(label)s%(errors)s%(field)s%(help_text)s',
            error_row = '%s',
            row_ender = ' ',
            help_text_html = '<br /><span class="helptext">%s</span>',
            errors_on_separate_row = False)

Мне просто показалось, что это проще сделать, чем написать файл шаблона и обработать поле формы формы с ошибками, тегами, видимыми/скрытыми и т.д.

Ответ 5

Шаблон:

<div id="my_form">
    {{ form.as_p }}
</div>

CSS

#my_form p label,
#my_form p input{
    float: left;
    clear: left;
}

Итак, если вы добавляете поля, вы все равно можете использовать form.as_p