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