如何在 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_formshttp://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' 需要在后端