2009-07-01 12 views
6

Quelle est la bonne façon de faire un formatage conditionnel dans Django?Django façon de faire un formatage conditionnel

J'ai un modèle qui contient un champ de date, et je voudrais afficher une liste d'enregistrements, mais la couleur des lignes en fonction de la valeur de ce champ de date. Par exemple, les enregistrements qui correspondent à la date du jour que je veux être jaune, les enregistrements qui sont avant aujourd'hui, je veux le vert et les autres après que je veux le rouge.

Quelque part dans Django vous aurez besoin de faire cette comparaison, en comparant la date actuelle à la date de l'enregistrement.

Je peux voir trois endroits différents que la comparaison pourrait être fait:

  1. Ajouter une méthode pour mon modèle, par exemple, le statut(), qui renvoie soit « passé », « présent », « futur » puis utilisez-le dans le modèle pour colorer les lignes.
  2. Dans la vue au lieu de retourner un queryset au modèle, prétraiter la liste et comparer chaque enregistrement, construire une nouvelle dict contenant les valeurs « passé », « présent » et « futur » à utiliser dans le modèle
  3. Créez une nouvelle balise de modèle qui effectue la comparaison.

Laquelle de ces méthodes est la bonne façon de le faire? Il semble que la formation conditionnelle soit quelque chose qui arrive assez souvent, et comme vous ne pouvez pas faire de comparaisons arbitraires dans le modèle, une autre solution est nécessaire. Il en irait de même pour des règles de formatage plus simples, par exemple si je voulais afficher une liste de notes d'étudiants, et je voulais que celles-ci soient vertes à 80% et rouges à 30%.

Répondre

8

Je suis un grand fan de mettre tous « business » logique dans la fonction d'affichage et ALL présentation dans les modèles/CSS.

L'option 1 est idéale. Vous renvoyez une liste de paires: (date, état), où l'état est le nom de classe ("passé", "présent", "futur").

Votre modèle utilise ensuite les informations d'état comme la classe pour une <span>. Votre CSS fournit ensuite le code de couleur pour cette durée.

Vous êtes maintenant libre de changer les règles sans casser le gabarit. Vous pouvez changer le CSS sans toucher au code HTML ou Python.

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

Une bonne solution, cependant, avec plus d'un modèle, vous devriez copier la méthode du modèle sur tous les autres modèles que vous voulez faire avec cela, ce qui rend cet itinéraire un peu humide. – googletorp

+0

L'héritage du modèle ou une fonction d'utilité réduirait la duplication du code. –

+0

@googletorp: La question n'a pas mentionné plus d'un modèle. La quantité de code requise pour l'attribution des noms de classes est triviale et peut certainement être soit une fonction séparée, soit une fonction réutilisée, soit une partie d'une superclasse. –

1

Puisque vous faites la comparaison statique (pas de requêtes nécessaires), vous devriez aller pour le plus sec et facile à mettre en œuvre l'option. Dans ce cas, je voudrais aller à l'option 4, faire un filtre de modèle. Ensuite, vous pourriez faire une valeur | filter pour obtenir la classe dont vous auriez besoin pour définir la couleur d'arrière-plan. Les filtres de modèles sont en fait un peu plus simples que les balises de modèle à implémenter.

3

J'avais une exigence très similaire; car cela est assez connecté à la logique métier, j'ai ajouté une méthode de modèle pour gérer ce genre d'information, à utiliser ensuite dans le modèle:

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

Il pourrait également être obtenue par une étiquette de modèle ou filtre; mais dans mon cas, je sentais que le meilleur endroit pour la logique était à l'intérieur du modèle; Je vous suggère de l'analyser de la même manière.

0

Vous pouvez également jeter un oeil à la référence de Django pour les balises de formatage et de filtrage intégrées.Il a certainement ce que vous cherchez et plus encore et c'est un bon lien pour avoir mis en signet.

Vous pouvez jeter un coup d'oeil à .

Questions connexes