Как изменить макеты форм в Django 1.8

У меня есть форма

Field Name: [Input Box]

Я хочу

Field Name:
[Input Box]

Как я могу это достичь?

forms.py

class SearchForm(forms.Form):
    search = forms.CharField()

views.py

form = SearchForm()
html_dtc = {'form':form}
return render_to_response('site/home.html', html_dtc)

home.html

<form method='POST' action=''> {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-success btn-sm">Update</button>
</form>

Спасибо:)

Ответ 1

Вы хотите персонализированную визуализацию формы. Вы можете прочитать об этом здесь. Например, следующий код достигнет того, что вам нужно.

<form method='POST' action=''> {% csrf_token %}
    {% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} <br/>
        {{ field }}
    </div>
    {% endfor %}
    <button type="submit" class="btn btn-success btn-sm">Update</button>
</form>

(field.errors добавляются, потому что, когда вы вручную визуализируете форму, вы также должны заботиться об ошибке)

Ответ 2

Попробуйте переопределить form.as_p()

class SearchForm(forms.Form):
   search = forms.CharField()

   def as_p(self):
    "Returns this form rendered as HTML <p>s."
     return self._html_output(
        normal_row='<p%(html_class_attr)s>%(label)s <br> %(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)

Ответ 3

Если это одна вещь, вы можете сделать свою форму вручную, как описано здесь в документации.

В противном случае django-floppyforms, который дает вам отличный контроль над тем, как визуализируются формы и (по умолчанию) виджеты. Просто определите пользовательский макет, сделайте его по умолчанию, используйте собственные классы форм floppyforms (они ведут себя точно так же), и вам хорошо идти.

Насколько я помню, некоторые функции floppyforms также будут включены в Django 1.9, поэтому также обратите внимание на это.

Ответ 4

Используйте django_crispy_forms: http://django-crispy-forms.readthedocs.org/en/latest/

В шаблон включены {% load crispy_forms_tags %} и для формы:

{% crispy form %}

Кроме того, вы можете легко изменить расположение формы, переопределив form_class в функции init формы:

class ContactForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.form_class = 'form-horizontal' # <-- leave out for vertical, or form-inline
        self.helper.render_hidden_fields = True
        self.helper.layout = Layout(
            Div(InlineRadios('applying_for_whom'), css_class="col-xs-12"),
            Div(InlineRadios('gender'), css_class='col-xs-12'),
            Div('agreed_to_data_transmit', css_class="col-xs-12"),

В качестве бонуса, если вы используете bootstrap, установите также set CRISPY_TEMPLATE_PACK = 'bootstrap3', после чего все будет автоматически исправлено для вертикального бутстрапа.

Ответ 5

вы можете сделать

<form method='POST' action=''>
    {% csrf_token %}
    <label>Field Name:</label>
    {{ form.search }}
    <button type="submit" class="btn btn-success btn-sm">Update</button>
</form>

Ответ 6

Обычно я не рекомендую использовать HTML-код, созданный Django, но вместо этого я поставляю то, что нужно в форме DJANGO.

но некоторые из них требуются: например, ОШИБКИ, такие как токен CSRF.

Позвольте мне добавить несколько примеров, чтобы прояснить, что я говорю

<form class="*" style="*">
    <label /><input name="email" />
    <label /><input name="password" />
<form>

В основном, что я предлагаю, не используйте теги шаблонов, если не требуется абсолютное значение, например CSRF.

таким образом, вы можете полностью отделить дизайн от логики бэкэнд. вы можете работать с интерфейсом в интерфейсе пользователя. интерфейс - это поля формы, вы должны предоставить все поля на бэкэнд. например, в этом случае "электронная почта" && "пароль" требуется на бэкэнд