2011-06-27 2 views
12

私はこれを行うと:DjangoテンプレートでHumanizeを使用して「x日前」に時間を表示するにはどうすればいいですか?

{% load humanize %} 

{{ video.pub_date|naturaltime|capfirst }} 

は、私は時間なしでわずか2日間を取得できますか2 days, 19 hours ago

を取得します。基本的に、動画が1日未満で公開された場合は、X時間前に表示され、X日前、週数などの日数でカウントされます。私はちょうど1時間5分前または2日13分前を望んでいません。ちょうど最初の部分。

私はhumanize文書を見ましたが、私が必要としていたものは見つかりませんでした。

答えて

24

Djangoは上記と同じ出力を提供する timesinceを持っています。次のフィルタは、単にカンマの後の第2の部分を取り除き:

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

register = template.Library() 

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

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

django.contrib.humanize.templatetags.humanize.pyをmyapp.templatetags.myhumanizeに複製し、必要に応じて変更する必要があります。 (x日、y時間前に返す実際の行は見つかりません)

+3

私は、コードをコピーして、それを修正することに対して推薦する:私の頭の上をオフに複数形日/日とのコンボで

出力例、。それは新しいバージョンからのものを壊す可能性があります。 – Darioush

0

をそれが直接それをフォーマットするクエリセットとデータベースを利用する場合はあなたが今もExpressionWrapperやケース/を使用することができます。

overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField()) 
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue) 
関連する問題