【问题标题】:How to change form layouts in Django 1.8如何在 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>

谢谢你:)

【问题讨论】:

    标签: django python-2.7 django-forms


    【解决方案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_formshttp://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,我添加了一些细节。希望对您有所帮助。