2009-07-01 15 views
6

Qual è il modo corretto di eseguire la formattazione condizionale in Django?Modo Django per eseguire la formattazione condizionale

Ho un modello che contiene un campo data e vorrei visualizzare un elenco di record, ma colorare le righe a seconda del valore di quel campo data. Ad esempio, i record che corrispondono alla data di oggi voglio essere giallo, i record che prima di oggi voglio verde e quelli dopo che voglio rosso.

Da qualche parte in Django è necessario fare questo confronto, confrontando la data corrente con la data nel record.

posso vedere tre luoghi diversi che il confronto potrebbe essere fatto:

  1. aggiungere un metodo per il mio modello, per esempio, lo stato(), che restituisce 'passato', 'presente', 'futuro' e quindi utilizzare quello nel modello per colorare le righe.
  2. Nella vista invece di restituire un queryset al modello, pre-elaborare l'elenco e confrontare ogni record, creare un nuovo dict contenente i valori "passato", "presente" e "futuro" da utilizzare nel modello
  3. Creare un nuovo tag modello che esegue il confronto.

Quale di questi metodi è il modo corretto di farlo Django? Sembra che la formulazione condizionale sia qualcosa che verrebbe fuori abbastanza spesso, e dal momento che non è possibile fare confronti arbitrari nel modello, è necessaria qualche altra soluzione.

Lo stesso si applica alle regole di formattazione più semplici, ad esempio, se volessi visualizzare un elenco di voti degli studenti, e volevo rendere quelli superiori all'80% di verde e quelli al di sotto del 30% di rosso.

risposta

8

Sono un grande fan di mettere TUTTE le logiche "aziendali" nella funzione di visualizzazione e TUTTE le presentazioni nei modelli/CSS.

L'opzione 1 è ideale. Si restituisce una lista di coppie: (data, stato), dove lo stato è il nome della classe ("passato", "presente", "futuro").

Il modello utilizza quindi le informazioni sullo stato come classe per un <span>. Il tuo CSS quindi fornisce la codifica a colori per quella estensione.

Ora sei libero di cambiare le regole senza rompere il modello. Puoi cambiare il CSS senza toccare HTML o codice Python.

{% for date,state in the_date_list %} 
    <span class="{{state}}">date</span> 
{% endfor %} 
+0

Una buona soluzione, tuttavia, con più di un modello dovresti copiare il metodo del modello su ogni altro modello con cui vuoi farlo, rendendo questo percorso un po 'umido. – googletorp

+0

Tuttavia, l'ereditarietà del modello o una funzione di utilità ridurrebbe la duplicazione del codice. –

+0

@googletorp: la domanda non ha menzionato più di un modello. La quantità di codice richiesta per eseguire l'assegnazione dei nomi di classe è banale e può certamente essere una funzione separata, riutilizzata o parte di una superclasse. –

1

Dato che si sta eseguendo un confronto statico (non sono necessarie query), è necessario utilizzare l'opzione più semplice e facile da implementare. In questo caso, vorrei andare per l'opzione 4, creare un filtro modello. Quindi puoi fare valore | filter per ottenere la classe che ti serve per impostare il colore di sfondo. I filtri dei modelli sono in realtà un po 'più semplici dei tag modello da implementare.

3

Avevo un requisito molto simile; come questo è abbastanza collegata alla logica di business, ho aggiunto un metodo modello per gestire questo tipo di informazioni, da utilizzare poi nel modello:

{% if not bug.within_due_date %}bgcolor="OrangeRed"{% endif %} 

Potrebbe anche essere ottenuto tramite un tag modello o un filtro; ma nel mio caso, ho sentito che il posto migliore per la logica era all'interno del modello; Ti suggerirei di analizzarlo allo stesso modo.

0

puoi anche dare un'occhiata al riferimento di Django per i tag di formattazione e filtro incorporati.Ha sicuramente quello che stai cercando e molto altro ed è un buon link per avere un segnalibro.

Puoi dare un'occhiata a questo here.

Problemi correlati