2009-07-01 26 views
6

Djangoで条件付き書式を設定する正しい方法は何ですか?Djangoで条件付き書式を設定する

私は日付フィールドを含むモデルを持っていますが、レコードのリストを表示したいのですが、その日付フィールドの値に応じて行を色分けしたいと思います。たとえば、今日の日付と一致するレコードは黄色になり、今日のレコードは緑色になり、その後は赤色になります。

Djangoのどこかで、現在の日付とレコードの日付を比較する必要があります。

私は比較が行われることができる三つの異なる場所で見ることができます

  1. は「過去」、「現在」、「未来」のいずれかを返すこと、例えば、状態()、私のモデルにメソッドを追加します。テンプレート内の行を使用して行を色付けします。
  2. クエリーセットをテンプレートに返す代わりに、リストを前処理して各レコードを比較し、テンプレートに使用する '過去'、 '現在'、および '未来'の値を含む新しいdictを作成します。
  3. 比較を行う新しいテンプレートタグを作成します。

どの方法が正しいジャンゴのやり方ですか?条件付きフォーマッティングは非常に頻繁に起こるもので、テンプレートで任意の比較を行うことはできないので、他の解決策が必要です。

たとえば、学生の成績のリストを表示する場合など、より簡単な書式設定のルールにも同じことが適用され、80%が緑色より高く、30%が赤色より低くなるようにしたいとします。

答えて

8

私はビュー機能にすべての "ビジネス"ロジックとテンプレート/ CSSのすべてのプレゼンテーションを入れていることの大ファンです。

オプション1が理想的です。クラスの名前(「過去」、「現在」、「未来」)であるペアのリスト(日付、状態)を返します。

テンプレートは、<span>のクラスとして状態情報を使用します。 CSSはそのスパンの色分けを行います。

テンプレートを破棄せずにルールを自由に変更できます。 HTMLやPythonコードに触れることなくCSSを変更することができます。

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

しかし、複数のモデルでは、モデル手法を他のすべてのモデルにコピーしなければならないため、このルートを少し濡らす必要があります。 – googletorp

+0

モデルの継承とユーティリティ関数のどちらでも、コードの重複を減らすことができます。 –

+0

@googletorp:質問には複数のモデルは言及されていませんでした。クラス名の割り当てに必要なコードの量は些細なものであり、確かに別々の、再利用された関数、またはスーパークラスの一部である可能性があります。 –

1

静的な比較(クエリは不要)を行っているので、最もドライで実行しやすいオプションを選択する必要があります。この場合は、オプション4のテンプレートフィルタを作成します。その後、値のフィルターを使用して、背景色を設定する必要があるクラスを取得できます。テンプレートフィルタは実際に実装するテンプレートタグよりも少しシンプルです。

3

私は非常によく似た要件を持っていました。これは、ビジネスロジックにきれいに接続されているように、私は、テンプレートに次に使用する、この種の情報を管理するためのモデルメソッドを追加しました:

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

また、テンプレートタグやフィルタを介して得ることができます。私の場合、ロジックの最適な場所はモデルの中にあると感じました。同じように分析することをお勧めします。

0

また、組み込みのフォーマットタグとフィルタリングタグについては、Djangoのリファレンスを参照することもできます。それは確かにあなたが探しているものを持っており、それはブックマークした良いリンクです。

hereをご覧ください。

関連する問題