在Django表单字段之间显示一些自由文本

时间:2009-04-07 22:59:07

标签: python django django-forms

我的表格如下:

class MyForm(Form):

  #personal data
  firstname = CharField()
  lastname = CharField()

  #education data
  university = CharField()
  major = CharField()

  #foobar data
  foobar = ChoiceField()

由于某些字段(如foobar)是从数据库填充的,除了让Django使用form.as_ul

让Django为我渲染之外,我不能使用其他方法

此外,我希望我不必将表格拆分为多种形式以便于维护

有没有办法告诉Django在这些表单部分之间显示帮助文本,以便我可以提供一些如何填写表单的说明?

我希望表单能够呈现这样的内容:

<form>

  <p>Here you enter your personal data...</p>
  <input name='firstname'>
  <input name='lastname'>

  <p>Here you enter your education data...</p>
  <input name='university'>
  <input name='major'>

</form>

我是否需要创建自己的小部件才能显示这些<P>代码,还是有更简单的方式?

由于

8 个答案:

答案 0 :(得分:14)

使用form.as_ul在模板中不显示表单的一种方法是使用django-uni-form。首先,您必须下载here并安装它。然后,设置表单的代码可能如下所示:

from uni_form.helpers import FormHelper, Submit, Layout, Fieldset

class MyForm(Form):

    #personal data
    firstname = CharField()
    lastname = CharField()

    #education data
    university = CharField()
    major = CharField()

    #foobar data
    foobar = ChoiceField()

    # now attach a uni_form helper to display the form
    helper = FormHelper()

    # create the layout
    layout = Layout(
         # first fieldset
         Fieldset("Here you enter your personal data...",
             'firstname', 'lastname'),
         Fieldset("Here you enter your education data...",
             'university', 'major'),
         Fieldset('foobar')

    # and add a submit button
    sumbit = Submit('add', 'Submit information')
    helper.add_input(submit)

现在,要在模板中显示它,您可以这样做:

{% load uni_form %}
{% with form.helper as helper %}
    {% uni_form form helper %}
{% endwith %}

这将输出HTML(大致)如下:

<form>
<fieldset><legend>Here you enter your personal data...</legend>
<input name='firstname'>
<input name='lastname'>
</fieldset>

<fieldset><legend>Here you enter your education data...</legend>
<input name='university'>
<input name='major'>
</fieldset>

<fieldset>
<input name='foobar'>
</fieldset>

</form>

有关uni_form的更多信息,请阅读他们的文档(请参阅上面的链接)。

PS:我意识到这个回复已经很晚了,我相信你已经解决了这个问题,但我认为这对现在遇到这个问题的人来说应该会有所帮助。

答案 1 :(得分:9)

如果要自定义表单,则不必呈现它form.as_ul。如果你正确设置了表单模型,Django知道如何渲染foobar ...试试吧......不用担心。

查看服务器上发送页面的python。例如,如果它发送了这样的django表单:

return respond(request, user, 'templateName', { 'myform':myform })

然后 templateName.html 将具有:

<blockquote>
<form>

    <p>Here you enter your personal data...</p>
    {{myform.firstname }}

    <p>Here you enter your education data...</p>
    {{myform.university }}

    <p> a choice field </p>
    {{myform.foobar}}

</form>
</blockquote>

答案 2 :(得分:3)

由于每个部分都是多个独立表单字段的集合,因此我建议使用自定义表单模板。这使您可以通过最少的额外工作绝对完全控制布局。 Django的Customizing the Form Template文档有详细信息。

答案 3 :(得分:2)

还要记住,Django Form对象只是一个字段集合; HTML表单标签和Django表单对象之间不需要1:1的对应关系。如果表单的各个部分实际上在逻辑上是分开的,您可以考虑将其拆分为三个表单,然后您可以在模板中使用它们之间的任何HTML进行渲染(但仍然在单个HTML表单标记内)。

这是否是一个明智的解决方案,当然取决于你的应用程序和视图的设计。

答案 4 :(得分:1)

您知道的表单中有help_text字段。

forms.py

中的

  • myField = forms.myFieldType(help_text="Helping friendly text to put in your form", otherStuff=otherStuff)
forms.html 中的

  • {{form.myField.help_text}}

答案 5 :(得分:0)

即使您的表单是从数据库填充的,您仍然可以手动写出表单或使用模板。查看Django form documentation了解更多详情。

答案 6 :(得分:0)

对于与作者处于类似情况的人,我建议回到CSS :before和/或:after假选择器inputlabel形式的元素。他们的工作也很好,可以让你的生活更轻松,因为你仍然可以使用{{ form.as_p }}

答案 7 :(得分:-1)

同意@mipadi,似乎这是最简单的方法。

类似

$('.selector').append('<html></html>')