如何在 Django 1.8 中更改表单布局
Posted
技术标签:
【中文标题】如何在 Django 1.8 中更改表单布局【英文标题】:How to change form layouts in Django 1.8 【发布时间】:2015-11-06 03:56:05 【问题描述】:我有一个表格
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】:您想要自定义表单呈现。你可以阅读更多关于它的信息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
,因为当您手动渲染表单时,您还必须注意错误渲染)
【讨论】:
看来我们赢了【参考方案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】:如果这是一次性的事情,您可以像文档中描述的 here 那样手动呈现表单。
否则,django-floppyforms 可以让您很好地控制表单和(默认)小部件的呈现方式。 只需定义一个custom layout,将其设为默认值,使用 floppyforms 自定义 Form 类(它们的行为完全相同),您就可以开始了。
据我所知,一些 floppyforms 的功能也将包含在 Django 1.9 中,所以也要注意这一点。
【讨论】:
【参考方案4】:使用django_crispy_forms
:http://django-crispy-forms.readthedocs.org/en/latest/
在模板中包含% load crispy_forms_tags %
和表单:
% crispy form %
此外,您可以通过覆盖表单的 init 函数中的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"),
作为奖励,如果您使用引导程序,请同时设置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】:通常我不建议使用 Django 生成的 HTML 代码,而是提供 DJANGO 表单所需的内容。
但有些是必需的:例如 ERROR,例如 CSRF 令牌。
让我添加一些例子来澄清我在说什么
<form class="*" style="*">
<label /><input name="email" />
<label /><input name="password" />
<form>
基本上我的建议是,除非像 CSRF 那样绝对必要,否则不要使用模板标签。
通过这种方式,您可以将设计与后端逻辑完全分离。您可以在 UI 上不雅地进行前端工作。接口是表单字段,您必须将所有字段提供给后端。就像在这种情况下,后端需要'电子邮件'&&'密码'
【讨论】:
@derrend,我添加了一些细节。希望对您有所帮助。以上是关于如何在 Django 1.8 中更改表单布局的主要内容,如果未能解决你的问题,请参考以下文章
如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?
如何更改 LoginView 中调用的 AuthenticationForm 标签以及如何在 LoginView 中使用另一个表单? (Django 3.0)