如何在Django 1.8中更改表单布局

时间:2015-08-13 09:04:12

标签: django python-2.7 django-forms

我有一张表格

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>

谢谢:)

5 个答案:

答案 0 :(得分: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已添加,因为当您手动呈现表单时,您还必须处理错误呈现)

答案 1 :(得分:3)

尝试覆盖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)

答案 2 :(得分:2)

如果这是一次性的事情,您可以手动呈现表单,如文档中描述的here

否则就有django-floppyforms,它可以很好地控制表单和(默认)小部件的呈现方式。 只需定义一个custom layout,将它设为默认值,使用floppyforms自定义Form类(它们的行为完全相同),你就可以了。

据我记得,一些软盘的功能也将包含在Django 1.9中,所以也要注意这一点。

答案 3 :(得分:1)

你可以做到

<form method='POST' action=''>
    {% csrf_token %}
    <label>Field Name:</label>
    {{ form.search }}
    <button type="submit" class="btn btn-success btn-sm">Update</button>
</form>

答案 4 :(得分:0)

一般情况下,我不建议使用Django生成的HTML代码,而是提供DJANGO表格所需的内容。

但有些是必需的:如ERROR,如CSRF令牌。

让我添加一些例子来澄清我在说什么

<form class="*" style="*">
    <label /><input name="email" />
    <label /><input name="password" />
<form>

基本上我建议的是,除非绝对必要,否则不要使用模板标签,如 CSRF

通过这种方式,您可以将设计与后端逻辑完全分开。你可以在UI上猥亵前端工作。接口是表单字段,您必须将所有字段提供给后端。就像在这种情况下&#39;电子邮件&#39; &安培;&安培; &#39;密码&#39;在后端是必需的