我有一个像下面这样的表格:
class MyForm(Form):
#personal data
firstname = CharField()
lastname = CharField()
#education data
university = CharField()
major = CharField()
#foobar data
foobar = ChoiceField()
因为有些字段(如foobar)是从数据库填充的,所以我不能使用其他方法,只能让Django在www.example.com _ul上为我渲染它form.as。
我也希望我不必把形式拆分成多个形式,以便于维护
有没有一种方法可以告诉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>
我需要创建自己的widget来显示<P>
标签吗,或者有更简单的方法吗?
谢谢
9条答案
按热度按时间kzipqqlq1#
一种方法是使用django-uni-form,而不用在模板中显示表单,而使用form.as_ul。首先,你必须下载它here并安装它。然后,设置表单的代码可能看起来像这样:
现在,要在模板中显示它,您可以这样做:
这将输出HTML(大致)如下:
有关uni_form的更多信息,请阅读他们的文档(参见上面的链接)。
PS:我知道这个回复有点晚了,我相信你已经解决了这个问题,但我认为这应该是有帮助的任何人刚刚遇到这个现在。
mrwjdhj32#
如果您想自定义表单,则不必将其呈现为
form.as_ul
。Django知道如何渲染foobar,如果你已经正确地设置了表单模型……试试吧……不用担心。看看服务器上的Python给你发送了什么页面。例如,如果它发送了一个像这样的django表单:
return respond(request, user, 'templateName', { 'myform':myform })
那么 templateName.html 将具有:
jchrr9hc3#
由于每个部分都是多个独立表单域的集合,因此我建议使用自定义表单模板。这使您能够以最少的额外工作完全控制布局。Django的Customizing the Form Template文档有详细说明。
mfuanj7w4#
还要记住Django Form对象只是字段的集合; HTML表单标签和DjangoForm对象之间不需要1:1的对应关系。如果表单的各个部分实际上在逻辑上是分开的,您可以考虑将其拆分为三个表单,然后可以在模板中呈现它们之间的任何HTML(但仍然在单个HTML表单标记中)。
当然,这是否是一个明智的解决方案在很大程度上取决于您的应用程序和视图的设计。
omtl5h9j5#
你知道的表单中有一个
help_text
字段。in forms.py:
myField = forms.myFieldType(help_text="Helping friendly text to put in your form", otherStuff=otherStuff)
在 forms.html:
{{form.myField.help_text}}
r9f1avp56#
即使您的表单是从数据库填充的,您仍然应该能够手动写出表单,或者使用模板。查看Django表单文档了解更多细节。
acruukt97#
对于那些与作者类似的情况,我建议回到CSS和
:before
和/或:after
伪选择器,无论是在表单的input
或label
元素上。它们工作得很好,可以让你的生活轻松得多,因为你仍然可以使用{{ form.as_p }}
。cbjzeqam8#
解决方案
django-crispy-forms
包**,它非常容易用于控制Django表单的渲染行为(参见Crispy docs)。使用此包(see Crispy/Layouts docs)的**
Layout
类允许您更改表单字段的呈现方式。在这个Layout类中,你可以使用HTML
布局对象**,它可以让你按照你想要的方式呈现文本。代码
要获得所需的结果,类定义应该如下所示:
它将呈现这个HTML:
8fq7wneg9#
我同意@mipadi的观点,似乎这是最简单的方法。
比如说