2011-06-27 20 views
12

Kiedy to zrobić:Jak wyświetlić czas typu "x dni temu" za pomocą Humanize w szablonie Django?

{% load humanize %} 

{{ video.pub_date|naturaltime|capfirst }} 

uzyskać 2 days, 19 hours ago

Jak mogę uzyskać tylko 2 dni bez godzin. Zasadniczo, jeśli wideo zostało opublikowane w mniej niż jeden dzień temu, powinno to oznaczać X godzin temu, to powinno się liczyć w dniach takich jak X dni temu, a następnie w tygodniach. Po prostu nie chcę 1 godziny 5 minut temu lub 2 dni 13 minut temu. Tylko pierwsza część.

Spojrzałem na humanizowane dokumenty, ale nie mogłem znaleźć tego, czego potrzebowałem.

Odpowiedz

24

Django ma a built-in template filtertimesince, która oferuje tę samą wydajność, o której wspomniano powyżej. Poniższy filtr tylko wycina drugą część po przecinku:

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

Powinieneś powielić swój django.contrib.humanize.templatetags.humanize.py do myapp.templatetags.myhumanize i zmodyfikować go do swoich potrzeb. (Nie mogę znaleźć aktualnej linii, która zwraca "x dni, y godzin temu". Którą wersję django/humanize używasz?)

+3

Polecam przeciwko kodu kopiowania i modyfikowania go. To może zepsuć rzeczy z nowszych wersji. – Darioush

0

Można również użyć teraz jest ExpressionWrapper lub CASE/Kiedy to będzie wykorzystać queryset i bazy danych, aby sformatować go bezpośrednio.

Przykâadowa, w połączeniu z kombinacją dzień/dni liczbę mnogą od szczytu głowy:

overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField()) 
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue) 
Powiązane problemy