views:

1237

answers:

7

Hi all,

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

+3  A: 

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.

Jarret Hardie
True, i could also output some stuff based on the fieldname
L. De Leo
+1  A: 

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.

mipadi
+1  A: 

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.

Carl Meyer
+4  A: 

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

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.

hora
A: 

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}}
hendrixski
A: 

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

snz3