17

日付である場合もあれば文字列である場合もあるテーブルに取り込む変数があります。変数が日付の場合、フォーマットを変更したい:

<td>{{ action.extra_column|date:"M d" }}</td>

しかし、それが文字列の場合は、そのまま表示したいだけです:

<td>{{ action.extra_column }}</td>

書式設定しようとして文字列の場合、変数の出力が得られません。

タイプに基づいてレンダリングを調整できるように、タイプを特定するにはどうすればよいですか。

4

5 に答える 5

37

type()ビルトインと同等のものとして、一般的なテンプレート フィルターを実装することもできます。

# app/templatetags/util.py
from django import template

register = template.Library()

@register.filter
def get_type(value):
    return type(value)

# template.html
{% load util %}
{% if extra_column|get_type == 'str' %}
    String
{% elif extra_column|get_type == 'datetime.date' %}
    Date
{% else %}
    Oh no!
{% endif %}

しかし、Ignacio と Dirk は正しいと思います。と呼ばれる2つのキー(「配列」と言いますが、アイテムに名前があるという事実から「辞書」を意味していると思います)を持つことはできませんdatedetail

# views.py
...
actions = [{
    'some_property': 'some_value'
    'date': None,
    'detail': 'details'
},
{
    'some_property': 'some_value'
    'date': datetime.date.today(),
    'detail': None
}]
...

# template.html
{% for action in actions %}
<td>{% if action.date %}{{ action.date|date:"M d" }}{% endif %}{{ action.detail }}</td>
{% endfor %}

# output
<td>details</td>
<td>Aug 19</td>
于 2012-08-19T18:21:10.783 に答える
4

Ignacio Vazquez-Abrams が最初のコメントで指摘したように、これはロジックをコーディングするための優れた方法ではありません。変数に特定の型があることを確認します。これは、コンテキストに追加する追加の変数、またはデータを保持するオブジェクトとデータの種類を説明するものによって解決できます。

独自のロジックに固執したい場合は、独自のテンプレート フィルターを作成する方法が考えられます (それを と呼びましょうdate_or_string)。dateフィルタは、オプションの format パラメータを使用して組み込みフィルタをサブクラス化できます。パラメータが渡された場合、通常のdateフィルタのように機能し、パラメータがない場合は単純に文字列を返します。より複雑なシナリオでは、フィルタで型チェックを行うこともできます。単なるアイデアですが、実際にはそのようなロジックをテンプレートに入れません。

于 2012-08-19T15:17:06.863 に答える