如何在 Django 1.8 中更改表单布局
How to change form layouts in 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>
谢谢:)
如果这是一次性的事情,您可以按照文档中 here 的描述手动呈现表单。
否则还有 django-floppyforms 可以让您很好地控制表单和(默认)小部件的呈现方式。
只需定义一个 custom layout,将其设置为默认值,使用 floppyforms 自定义表单 类(它们的行为完全相同)就可以了。
据我所知,floppyforms 的一些功能也将包含在 Django 1.9 中,因此也请留意。
您想要自定义表单呈现。您可以阅读更多相关信息 here。例如,以下代码将实现您所追求的目标。
<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
,因为手动渲染表单时,还需要注意错误渲染)
尝试覆盖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)
使用django_crispy_forms
:http://django-crispy-forms.readthedocs.org/en/latest/
在模板中包含 {% load crispy_forms_tags %}
并且对于表单:
{% crispy form %}
此外,您可以轻松更改表单的布局,方法是重写表单初始化函数中的 form_class
:
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,请同时设置 CRISPY_TEMPLATE_PACK = 'bootstrap3'
,这样垂直 bootstrap.
的所有内容都会自动处理
你可以做到
<form method='POST' action=''>
{% csrf_token %}
<label>Field Name:</label>
{{ form.search }}
<button type="submit" class="btn btn-success btn-sm">Update</button>
</form>
一般来说,我不建议使用 Django 生成的 HTML 代码,而是提供 Django 表单所需的代码。
但有些是必需的:比如 ERROR,比如 CSRF 令牌。
让我添加一些例子来阐明我在说什么
<form class="*" style="*">
<label /><input name="email" />
<label /><input name="password" />
<form>
基本上我的建议是,除非绝对必要,否则不要使用模板标签,例如 CSRF。
这样就可以将设计和后台逻辑完全分离。你可以让前端在 UI 上不雅地工作。界面是表单字段,您必须向后端提供所有字段。就像在这种情况下 'email' && 'password' 需要在后端
我有一个表格
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>
谢谢:)
如果这是一次性的事情,您可以按照文档中 here 的描述手动呈现表单。
否则还有 django-floppyforms 可以让您很好地控制表单和(默认)小部件的呈现方式。 只需定义一个 custom layout,将其设置为默认值,使用 floppyforms 自定义表单 类(它们的行为完全相同)就可以了。
据我所知,floppyforms 的一些功能也将包含在 Django 1.9 中,因此也请留意。
您想要自定义表单呈现。您可以阅读更多相关信息 here。例如,以下代码将实现您所追求的目标。
<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
,因为手动渲染表单时,还需要注意错误渲染)
尝试覆盖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)
使用django_crispy_forms
:http://django-crispy-forms.readthedocs.org/en/latest/
在模板中包含 {% load crispy_forms_tags %}
并且对于表单:
{% crispy form %}
此外,您可以轻松更改表单的布局,方法是重写表单初始化函数中的 form_class
:
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,请同时设置 CRISPY_TEMPLATE_PACK = 'bootstrap3'
,这样垂直 bootstrap.
你可以做到
<form method='POST' action=''>
{% csrf_token %}
<label>Field Name:</label>
{{ form.search }}
<button type="submit" class="btn btn-success btn-sm">Update</button>
</form>
一般来说,我不建议使用 Django 生成的 HTML 代码,而是提供 Django 表单所需的代码。
但有些是必需的:比如 ERROR,比如 CSRF 令牌。
让我添加一些例子来阐明我在说什么
<form class="*" style="*">
<label /><input name="email" />
<label /><input name="password" />
<form>
基本上我的建议是,除非绝对必要,否则不要使用模板标签,例如 CSRF。
这样就可以将设计和后台逻辑完全分离。你可以让前端在 UI 上不雅地工作。界面是表单字段,您必须向后端提供所有字段。就像在这种情况下 'email' && 'password' 需要在后端