2012-11-20 15 views
5

Io di solito fare cose semplici e utilizzare la seguente sintassi modulo nei miei modelli:Produrre la giusta semantica HTML con Django

<div> 
     <div>{{form.title.label}}:</div> 
     <div>{{form.title}}</div> 
</div> 

Il problema di questo approccio è la cattiva semantica nell'output HTML.

<div> 
    <div>Title:</div> 
    <div><input id="id_form-title" type="text" maxlength="30" name="form-title"></div> 
</div> 

corretta dovrebbe essere:

<div> 
    <label for="id_form-title">Title</label> 
    <input id="id_form-title" type="text" maxlength="30" name="form-title"> 
</div> 

C'è un tag build-in Django per farlo automaticamente per me, o devo farlo manualmente me stesso come questo?

<div> 
    <label for="id_form-title">{{form.title.label}}</label> 
    {{form.title}} 
</div> 

risposta

3

E 'davvero fastidioso che l'output campi uno per uno non ti dà accesso automatico a un label elemento propriamente-costruito - facendo form.as_p saranno correttamente produrre i campi più etichette, ma si rinuncia totalmente il controllo della layout del modulo.

È possibile costruire il tag etichette utilizzando le informazioni di campo abbastanza facilmente se:

<label for="{{ field.auto_id }}">{{ field.label }}</label> 
{{ field }} 

Si può mettere questo in un tag modello per facilitare il riutilizzo.

Non dimenticare di aggiungere anche {{ field.errors }} per visualizzare gli errori associati a ciascun campo.

+0

+1 Sembra ragionevole. Come si fa un tag modello personalizzato per favore? – Houman

+1

https://docs.djangoproject.com/en/1.4/howto/custom-template-tags/#inclusion-tags –

+0

Questo funziona. Grazie. il tag di inclusione personalizzato è un vero gioiello. Rende i modelli molto più leggibili e mantenibili :) – Houman

2

utilizzando label_tag dovrebbe darti un tag etichetta costruito correttamente. Quindi, invece di {{form.title.label}} dovresti usare {{form.title.label_tag}} e il risultato sarà il codice html desiderato

+0

+1 da me. Anche questo funziona. Sebbene sia meno codice e più pulito, potresti avere bisogno di CSS personalizzati per l'etichetta e ho trovato l'altra soluzione per questo meglio. – Houman

+0

sì, naturalmente, se devi aggiungere un css personalizzato all'etichetta, l'altro funziona meglio – Rohan

Problemi correlati