0

カスタム テンプレート タグを使い始めたところです。

forum_tags.pyカスタム tempates モジュールに次のコードがあります。

from datetime import datetime, timedelta
from django import template
from django.utils.timesince import timesince

register = template.Library()

@register.filter
def time_until(value):
    now = datetime.now()
    try:
        difference = value - now
    except:
        return value

    if difference <= timedelta(minutes=1):
        return 'just now'
    return '%(time)s ago' % {'time': timesince(value).split(', ')[0]}

コードは、timesinceテンプレート タグによって返された文字列を取得し、その最初の値のみを返す必要があります (", " で分割)。

私のhtmlファイルでは、次のように使用します。

{% load forum_tags %}
<div class="started">
    <p>{{ obj.pub_date|timesince:forum_time|time_until }}</p>
</div>

しかし、私はまだ文字列全体を取得しています。どうしたの?

4

1 に答える 1

1

更新された問題の説明に基づいて:

私が望むのは、「timesince」関数の出力 (文字列) を取得し、文字列をコンマで分割し、FIRST 値のみをテンプレートに渡すことだけです。たとえば、timesince は「1 日、19 時間」を返しますが、「1 日」だけを取得したいのです。

split最良のアプローチは、Python の組み込みをフィルターとして公開することだと思います。簡単な実装は次のようになります。

@register_filter
def split(value, sep=None):
    return value.split(sep)

カスタム フィルターのドキュメントの推奨事項に合わせて拡張します。

フィルター関数は常に何かを返す必要があります。例外を発生させるべきではありません。それらは静かに失敗するはずです。エラーが発生した場合は、元の入力または空の文字列のどちらか意味のある方を返す必要があります。

@register_filter
def split(value, sep=None):
    try:
        return value.split(sep)
    except:
        return value

exceptコードにブランケットを書くのは好きではありませんが、何ができるかを制御することはできませvalueん (適切に呼び出したときに期待されるものだけです)。それが、静かに失敗することを確認する唯一の方法です。

次に、テンプレートで既存のfirstフィルターを使用します。

{% load forum_tags %}
<div class="started">
    <p>{{ obj.pub_date|timesince:forum_time|split:","|first }}</p>
</div>
于 2013-11-09T10:54:49.537 に答える