2009-04-07 18 views
12

Ho una forma simile alla seguente:mostrare del testo libero tra i campi modulo Django

class MyForm(Form): 

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

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

    #foobar data 
    foobar = ChoiceField() 

Dal momento che alcuni settori (come foobar) sono popolati dal database non posso usare un altro metodo diverso da lasciare Django renderla per me con form.as_ul

Inoltre vorrei non dover dividere la forma in molteplici forme per la facilità di mantainance

c'è un modo per dire Django per visualizzare un testo di aiuto tra questi forma sezioni in modo da poter inserire alcune istruzioni su come archiviare la forma?

mi piacerebbe il modulo di rendere qualcosa di simile:

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

avrei bisogno di creare il mio widget per essere in grado di visualizzare tali <P> tag, o c'è un modo più semplice?

Grazie

risposta

3

Dal momento che ogni sezione è una raccolta di più, campi modulo indipendente, mi consiglia di utilizzare un modello di modulo personalizzato. Questo ti dà il pieno controllo totale sul layout con un minimo lavoro extra. I documenti di Django Customizing the Form Template hanno i dettagli.

+0

È vero, ho potuto anche produrre alcune cose in base al nome del campo – Lorenzo

0

Anche se il modulo è popolato da un database, è comunque possibile scrivere manualmente il modulo o utilizzare un modello. Controlla il Django form documentation per maggiori dettagli.

1

Ricorda anche che un oggetto Django Form è solo una raccolta di campi; non c'è bisogno di una corrispondenza 1: 1 tra i tag form HTML e gli oggetti Django Form. Se le varie sezioni del modulo sono in realtà logicamente separate, puoi prendere in considerazione la possibilità di suddividerla in tre moduli, che potrai quindi visualizzare nel modello con qualsiasi HTML che desideri tra di loro (ma sempre all'interno di un singolo tag modulo HTML).

Se questa è una soluzione ragionevole dipende molto dal design della tua app e dalla vista, ovviamente.

9

Se si desidera personalizzare il modulo, non è necessario renderlo form.as_ul. Django sa come rendere il foobar se hai impostato correttamente il modello di moduli ... provalo ... non preoccuparti.

Osservate quale pitone sul server ha inviato la vostra pagina. Per esempio, se si ha inviato un modulo di django come questo:

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

poi templateName.html avrà:

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

Un modo per fare questo senza visualizzare il modulo nel modello tramite il modulo .as_ul, è con django-uni-form. Per prima cosa dovrai scaricarlo here e installarlo.Poi il codice per la configurazione del modulo potrebbe simile a questa:

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) 

Ora, per visualizzare questo nel vostro modello si dovrebbe fare questo:

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

Questo farebbe HTML uscita (approssimativamente) come questo :

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

Per ulteriori informazioni su uni_form, leggere i relativi documenti (vedere il collegamento sopra).

PS: Mi rendo conto che questa risposta è in ritardo, e sono sicuro che hai già risolto questo problema, ma penso che questo dovrebbe essere d'aiuto per chiunque si trovi proprio ora.

+0

grande doc rapido per iniziare a uni-forma –

1

C'è un campo help_text in forme che conosci.

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

Per coloro che si trovano in una situazione simile all'autore, consiglio di tornare ai CSS e agli :before e/o pseudoselector sugli elementi input o label del modulo. Funzionano altrettanto bene e potrebbero rendere la tua vita molto più semplice, dato che puoi ancora usare {{ form.as_p }}.

0

concordato con @mipadi, sembra che sia il modo più semplice.

Quindi qualcosa di simile

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