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