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

fhg3lkii  于 2023-05-19  发布在  Go
关注(0)|答案(9)|浏览(231)

我有一个像下面这样的表格:

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>标签吗,或者有更简单的方法吗?
谢谢

kzipqqlq

kzipqqlq1#

一种方法是使用django-uni-form,而不用在模板中显示表单,而使用form.as_ul。首先,你必须下载它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:我知道这个回复有点晚了,我相信你已经解决了这个问题,但我认为这应该是有帮助的任何人刚刚遇到这个现在。

mrwjdhj3

mrwjdhj32#

如果您想自定义表单,则不必将其呈现为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>
jchrr9hc

jchrr9hc3#

由于每个部分都是多个独立表单域的集合,因此我建议使用自定义表单模板。这使您能够以最少的额外工作完全控制布局。Django的Customizing the Form Template文档有详细说明。

mfuanj7w

mfuanj7w4#

还要记住Django Form对象只是字段的集合; HTML表单标签和DjangoForm对象之间不需要1:1的对应关系。如果表单的各个部分实际上在逻辑上是分开的,您可以考虑将其拆分为三个表单,然后可以在模板中呈现它们之间的任何HTML(但仍然在单个HTML表单标记中)。
当然,这是否是一个明智的解决方案在很大程度上取决于您的应用程序和视图的设计。

omtl5h9j

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}}
r9f1avp5

r9f1avp56#

即使您的表单是从数据库填充的,您仍然应该能够手动写出表单,或者使用模板。查看Django表单文档了解更多细节。

acruukt9

acruukt97#

对于那些与作者类似的情况,我建议回到CSS和:before和/或:after伪选择器,无论是在表单的inputlabel元素上。它们工作得很好,可以让你的生活轻松得多,因为你仍然可以使用{{ form.as_p }}

cbjzeqam

cbjzeqam8#

解决方案

    • 在Django表单字段之间显示一些自由文本的最简单方法使用django-crispy-forms包**,它非常容易用于控制Django表单的渲染行为(参见Crispy docs)。

使用此包(see Crispy/Layouts docs)的**Layout允许您更改表单字段的呈现方式。在这个Layout类中,你可以使用HTML布局对象**,它可以让你按照你想要的方式呈现文本。

代码

要获得所需的结果,类定义应该如下所示:

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, HTML

class MyForm(Form):
    # personal data
    firstname = CharField()
    lastname = CharField()

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

    # foobar data
    foobar = ChoiceField()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            HTML('<p>Here you enter your personal data...</p>')
            Field('firstname'),
            Field('lastname'),
            HTML('<p>Here you enter your education data...</p>')
            Field('university'),
            Field('major'),
            HTML('<p>Here you select...</p>')
            Field('foobar')
        )

它将呈现这个HTML:

<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'>

  <p>Here you select...</p>
  <input name='foobar'>
</form>
8fq7wneg

8fq7wneg9#

我同意@mipadi的观点,似乎这是最简单的方法。
比如说

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

相关问题