2009-12-15 10 views
6

Sto lottando con il modo migliore per creare pagine HTML in Django che possono essere utilizzate per la visualizzazione o la modifica dei dati. Cioè, vorrei che i valori del campo appaiano come testo in modalità di visualizzazione, ma nei loro widget quando ci si trova in modalità di modifica/aggiunta. Sembra che Django non sia stato progettato per farlo: i campi appaiono sempre nei loro widget (ad esempio, inserimento di testo, area di testo, ecc.).Utilizzare i moduli Django per visualizzare e modificare?

Esiste una tecnica comune per gestirlo, a meno di utilizzare i moduli per uno e non per l'altro?

Stavo pensando di un filtro personalizzato templatetag che potrebbe essere utilizzato per ogni campo di modulo, come:

{{form.field_name | render_field: modalità}}

dove render_field sarebbe o tornare HTML del campo widget, o solo il valore come testo, in base alla modalità.

Ho perso qualcosa o è una soluzione valida?

risposta

3

Rispondere alla mia domanda, apparentemente. Ho finito con una soluzione in tre parti:

  1. allegare il modello per la forma, per cui avrò i widget di visualizzazione di default per ogni campo
  2. scrivere la forma utilizzando un tag modello, passandogli il modulo .field, utente, e l'azione
  3. scrivere un tag modello di rendering per gestire # 2

Fase uno:

 
form.model = Model(...) 

Fase due:

 

{{form.field1.label}} 
{% render form.field1 user action %} 


{{form.field2.label}} 
{% render form.field2 user action %} 

Fase tre:

Qualcosa di simile:

 
def render(formfield, user, action, default_text="Private"): 
    if not user.is_authenticated(): 
     action = "view" 
    if action == "view": 
     if user.is_authenticated(): 
      fieldname = formfield.name 
      retval = str(getattr(formfield.form.model, fieldname)) 
     else: 
      retval = default_text 
    else: 
     retval = formfield.as_widget() 
    return retval 
0

Poiché si stanno salvando i dati, è necessario avere un modello allegato al modulo in qualche modo, un modello o meno. Quindi puoi semplicemente usare quel modello direttamente per ottenere i valori e renderlo in un modello come desideri.

Il suggerimento di cui sopra sarebbe possibile, ma dal momento che le forme possono essere piuttosto complesse, probabilmente non è un compito facile o vale la pena. Dipende da quanto spesso vuoi farlo. Ma probabilmente sarebbe più semplice creare un filtro per il modello invece del modulo.

+0

Sì, posso solo utilizzare il modello, ma che non approfittare di tutto ciò che le forme possono fare. Cosa avrebbe a che fare un filtro con questo? Ho molte visualizzazioni di visualizzazione/modifica, quindi una buona scelta potrebbe salvarci dal doverle fare ognuna due volte (una volta per la visualizzazione, una volta per la modifica). –

0

in un modello principale fanno

{% if form %} 
    {% include 'form.html' %} 
{% else %} 
    {% include 'display.html' %} 
{% endif %} 

allora quei due modelli sarebbe solo la parte che rende una forma, o un bel div organizzata. in questo modo, la vista di modifica avrebbe un modulo definito e la vista di visualizzazione non lo avrebbe. sarà molto più facile tenere traccia di quello che stai cercando di fare (anche se ciò che stai cercando dovrebbe essere possibile, credo che il tuo metodo ne risentirà in termini di prestazioni).

lo faccio in un'applicazione per blog in modo che la pagina di modifica assomigli alla pagina di visualizzazione, rendendo quindi estremamente intuitivo modificare/scrivere voci di blog. (Per non parlare di questo mi permette di mettere molto facilmente un po 'Ajax per modificare le voci all'interno di qualsiasi vista con alcuni effetti fantasia belle)

+0

Questo è esattamente quello che non voglio fare. Non voglio avere due forme, ma una. –

0

Ho perso qualcosa

forme non solo visualizzare i widget di campo, ma gestisci anche i dati del post. Un post inviato causerebbe l'elaborazione della pulitura dei dati, la gestione degli errori di campo e formale, ecc.

È un po 'come rompere il modello - perché creare e rendere un oggetto modulo solo per modificarlo per non sembrare un modulo?

Se si è preoccupati di lavorare troppo sui modelli, provare a risolverlo con l'ereditarietà del modello nel miglior modo possibile. Se siete molto sicuri di voler modificare solo l'etichetta di campo, è possibile effettuare STH come

{% if form %} 
    {% for error in form.field.errors %} 
     {{ error|escape }} 
    {% endfor %} 
    {{ form.field }} 
{% else %} 
    {{ object.field }} 
{% endif %} 

per ogni campo, ma IMO che non è questo il punto, YMMV.

Inoltre, ciò che viene in mente (pensando alla soluzione) è di allegare dinamicamente i widget per formare campi, ma sarebbe un ingombro eccessivo.

0

Ho lo stesso problema. In questo momento ho modelli separati per la visualizzazione e la modifica; il primo rende campi oggetto, i secondi campi modulo (ma a volte anche campi oggetto, per cose che non sono modificabili). La struttura HTML può essere piuttosto complessa: ad esempio, in alcune pagine ho tabelle di grandi dimensioni che rappresentano una gerarchia di oggetti a più livelli. Di conseguenza, finisco con una grande quantità di codice duplicato nei due modelli, che è l'opposto di DRY.

Ho usato filtri modello con campi modulo prima, per salvare codice quando si visualizzano errori insieme al campo. Penso che sarebbe una soluzione praticabile in questo caso. Un'altra possibilità potrebbe essere quella di usare una sottoclasse ModelForm che può essere detta per rendere versioni non modificabili dei campi. Ciò contribuirebbe a mantenere semplici i modelli. È possibile anche visualizzare sia la versione statica che quella modificabile di un campo e utilizzare JavaScript per passare da una all'altra, attivando e disattivando una modalità di modifica.

Problemi correlati