如何在 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)

Django:如何更改内联表单集中的字段小部件

Django-admin:如何在记录更改列表中显示指向对象信息页面的链接而不是编辑表单?

Django - 如何使日期选择器在更改时提交表单

Django 1.8 中的 Django 表单向导去了哪里?