3

テンプレート内の文字列の最初のx文字を取得するための単純なdjangoタグはありますか?

モデルインスタンスのリストで、オブジェクトインスタンスのステータスに応じて、オブジェクトインスタンスごとに異なるシンボルを指定したいと思います。ステータスは、「待機中」、「成功」、または「失敗したXXXX」であり、XXXXがエラーコードです。

objectinstance.status =='error'の最初の5文字かどうかを確認したいのですが、その後、記号は赤になります。しかし、どうすればこれを行うことができますか?Pythonでは、objectinstance.status [:5]を使用できます。

https://docs.djangoproject.com/en/dev/ref/templates/builtins/を使用して、次の「巨大な」連結でこれを行うことができましたが、.left()または.right()のような単純なものはありますか?

{% if run.status|make_list|slice:":5"|join:"" == 'error' %}
4

2 に答える 2

5

あなたは試すことができます:

{% if run.status|truncatechars:5 == 'error...' %}

( Django ドキュメントのtruncatecharsを参照してください)

全体的なポイントとして、この種のロジックを Django テンプレート (他のフレームワークのビュー) に入れるべきではないと言うかもしれませんが。これを Django ビュー (他のフレームワークのコントローラー) に配置します。つまり、あなたの見解では次のようになります。

has_error = run.status.startswith('error')

has_error がテンプレートに渡されていることを確認し、次のことを行います。

{% if has_error %}

手間がかかるかもしれませんが、エラー状態を検出するロジックを複数のビューとテンプレートで共有し、コントロール ロジックをビュー ロジックから分離することができます。

于 2013-03-04T22:42:32.640 に答える
0

Django 1.4+ を使用している場合、truncatecharsタグを使用できますが、回答の一部しか解決されず、最後に省略記号が追加されます。

実行可能な唯一の方法は、カスタム フィルターを作成することです。以下は、カスタマイズできる最初のドラフトです。

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def slicestring(value, arg):
    """usage: "mylongstring"|slicestring:"2:4" """
    els = map(int, arg.split(':'))
    return value[els[0]:els[1]]

おまけとして、このフィルターを使用すると、引数として「スライス文字列」を指定することで、スライス表記をほぼ完全に模倣できます。唯一の例外は、[:9]に置き換える必要がある構文のようです。つまり、次の[0:9]引数を使用します。yourvariable|slicestring:"0:9"

補足: あなたの質問は「文字列の最初の部分を取得する」ため、カスタム フィルターが正しい答えである可能性があると思いますが、スライスされた文字列を取得する唯一の理由がifステートメント内のその部分をチェックすることである場合は、次に、アントンに同意する必要があります。可能であれば、テンプレート内ではなく、ビュー内にチェックを配置する必要があります。

于 2013-03-04T22:46:22.677 に答える