Display some free text in between Django Form fields

倾然丶 夕夏残阳落幕 提交于 2019-12-20 10:37:52

问题


I have a form like the following:

class MyForm(Form):

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

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

  #foobar data
  foobar = ChoiceField()

Since some fields (like foobar) are populated from the database i can't use another method other than letting Django render it for me with form.as_ul

Also i wish i don't have to split the form in multiple forms for ease of mantainance

Is there a way to tell Django to display a help text in between these form sections so that i can put in some instructions on how to fill the form?

I'd like the form to render something like this:

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

Would i need to create my own widget to be able to display those <P> tags, or is there an easier way?

Thanks


回答1:


One way to do this without displaying your form in the template using form.as_ul, is with django-uni-form. First you'll have to download it here and install it. Then the code for setting up your form could looks something like this:

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)

Now, to display this in your template you would do this:

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

This would output HTML (roughly) like this:

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

For more info on uni_form, read their docs (see the link above).

PS: I realize this reply is late, and I'm sure you already solved this problem, but I think this should be helpful for anyone just coming across this now.




回答2:


If you want to customize the form, you don't have to render it form.as_ul. Django knows how to render foobar if you have set up the forms model properly...try it...no worries.

Look at what python on the server sent your page. For example if it sent a django form like this:

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

then templateName.html will have:

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



回答3:


Since each section is a collection of multiple, independent form fields, I recommend using a custom form template. This gives you absolute full control over the layout with minimal extra work. Django's Customizing the Form Template docs have the details.




回答4:


Remember also that a Django Form object is just a collection of fields; there is no need for a 1:1 correspondence between HTML form tags and Django Form objects. If the various sections of the form are actually logically separate, you could consider splitting it up into three Forms, which you could then render in your template with any HTML you want between them (but still within a single HTML form tag).

Whether this is a sensible solution depends quite a bit on the design of your app and the view, of course.




回答5:


There is a help_text field in forms you know.

in forms.py:

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

in forms.html:

  • {{form.myField.help_text}}



回答6:


Even though your form is populated from a database, you should still be able to manually write out the form, or use a template. Check out the Django form documentation for more details.




回答7:


For those into a similar situation as the author, I recommend falling back to CSS and the :before and/or :after pseudoselectors either on the input or the label elements of the form. They work just as well and could make your life a lot easier as you can still use {{ form.as_p }}.




回答8:


agreed with @mipadi, seems it's the easiest way.

So something like

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


来源:https://stackoverflow.com/questions/727917/display-some-free-text-in-between-django-form-fields

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!