2011-06-27 11 views
12

Bunu yaparken:Dizego şablonunda Humanize'i kullanarak "x gün önce" yaz saati nasıl görüntülenir?

{% load humanize %} 

{{ video.pub_date|naturaltime|capfirst }} 

Ben saat olmadan sadece 2 gün alabilirim nasıl 2 days, 19 hours ago

olsun. Temel olarak video bir günden az bir süre önce yayınlanmışsa, X saat önce söylemelidir, sonra X gün önce, sonra haftalar içinde gün sayılmalıdır. Sadece 1 saat 5 dakika önce ya da 2 gün 13 dakika önce istemiyorum. Sadece ilk kısım.

Humanize belgelerine baktım ama ihtiyacım olanı bulamadım.

cevap

24

Django yukarıda belirtilen aynı çıkışı sunuyor a built-in template filtertimesince sahiptir. Şu filtre sadece virgülden sonra ikinci bölümünü şeritler:

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 numaranızı myapp.templatetags.myhumanize kopyalayıp gereksinimlerinize göre değiştirmeniz gerekir. (Ben kullandığınız Django/insancıllaştırmak sürümü döndürür gerçek çizgisini "x gün, y saat önce". Bulamıyorum?)

+3

Ben kopyalama kodu ve onu değiştirmeye karşı öneriyoruz:

Örnek çıkışı, günün tuşlarıyla birlikte/gün başımın tepesinden çoğul. Bu, yeni versiyonlardan gelen şeyleri bozabilir. – Darioush

0

Ayrıca, hemen ExpressionWrapper veya Kılıfı kullanabilirsiniz/o doğrudan biçimlendirmek için Sorgu Kümesi ve veritabanı kullanan çıkacaktır.

overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField()) 
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue) 
İlgili konular