Quelle est la bonne façon de faire une mise en forme conditionnelle dans Django? P>
J'ai un modèle contenant un champ de date, et j'aimerais afficher une liste d'enregistrements, mais colorer les lignes en fonction de la valeur de ce champ de date. Par exemple, des enregistrements correspondant à la date d'aujourd'hui, je veux être jaune, des enregistrements qui sont avant aujourd'hui, je veux vert et ceux après que je souhaite rouge. P>
Quelque part dans Django, vous devrez faire cette comparaison, comparant la date actuelle à la date dans l'enregistrement. P>
Je peux voir trois endroits différents que la comparaison pourrait être faite: p>
Laquelle de ces méthodes est la bonne façon de le faire? On dirait que la formation conditionnelle est quelque chose qui viendrait assez souvent, et puisque vous ne pouvez pas faire des comparaisons arbitraires dans le gabarit, une autre solution est nécessaire. P>
La même chose s'appliquerait aux règles de formatage plus simples, par exemple, si je souhaitais afficher une liste des notes étudiantes, et je voulais faire plus de 80% de vert et celles inférieures à 30% de rouge. P>
4 Réponses :
Puisque vous faites une comparaison statique (aucune question requise), vous devriez aller pour l'option la plus sèche et la plus facile à mettre en œuvre. Dans ce cas, j'irais pour l'option 4, faire un filtre de modèle. Ensuite, vous pourriez faire de la valeur | Filtre pour obtenir la classe que vous auriez besoin de définir la couleur d'arrière-plan. Les filtres de modèle sont en réalité un peu plus simples que les étiquettes de modèle à mettre en œuvre. P>
J'ai eu une exigence très similaire; Comme cela est assez connecté à la logique commerciale, j'ai ajouté une méthode de modèle pour gérer ce type d'informations, puis dans le modèle:
{% if not bug.within_due_date %}bgcolor="OrangeRed"{% endif %}
Je suis un gros fan de la logique "business" dans la fonction de vue et de toutes les présentations dans les modèles / CSS.
L'option 1 est idéale. Vous retourne une liste de paires: (date, état), où l'état est le nom de la classe ("passé", "présent", "futur"). P>
Votre modèle utilise ensuite les informations de l'état comme Classe pour un Vous êtes maintenant libre de modifier les règles sans casser le modèle. Vous pouvez modifier le CSS sans toucher le code HTML ou Python. P> code>. Votre CSS fournit ensuite le codage de couleur pour cette portée. P>
{% for date,state in the_date_list %}
<span class="{{state}}">date</span>
{% endfor %}
Une bonne solution, cependant, avec plusieurs modèles, vous devez copier la méthode de la méthode sur tous les autres modèles que vous souhaitez en faire, ce qui rend cet itinéraire un peu mouillé.
L'héritage de modèle ou une fonction d'utilité réduirait cependant de la duplication de code.
@googletorp: la question n'a pas mentionné plus d'un modèle. La quantité de code requise pour l'attribution de noms de classe est triviale et peut certainement être une fonction distincte, réutilisée ou une partie d'une superclasse.
Une bonne solution mais ... couvre-t-elle vraiment le cas lorsque le côté client (navigateur) est dans la différentes fuseaux horaires que le serveur (Django Server)? Serait intéressant de savoir quelle est la meilleure approche dans le cas si vous devez faire du codage de couleur en fonction du temps du côté du client.
Vous pouvez également consulter la référence de Django pour les balises de formatage et de filtrage intégrées. Il a certainement ce que vous recherchez et plus et c'est un bon lien avec le signet. P>
Vous pouvez regarder ici A >. P>