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:
- 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.
- 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
- 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.
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
Tuttavia, l'ereditarietà del modello o una funzione di utilità ridurrebbe la duplicazione del codice. –
@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. –