2011-06-27 20 views
12

Cuando hago esto:Cómo mostrar "x días atrás" escriba la hora usando Humanize en la plantilla de Django?

{% load humanize %} 

{{ video.pub_date|naturaltime|capfirst }} 

me sale 2 days, 19 hours ago

¿Cómo puedo obtener sólo 2 días sin las horas. Básicamente, si el video se publicó hace menos de un día, debería decir X horas atrás, entonces debería contar en días como X días, luego en semanas. Simplemente no quiero hace 1 hora 5 minutos o hace 2 días 13 minutos. Solo la primera parte.

Miré los documentos de humanización pero no pude encontrar lo que necesitaba.

Respuesta

24

Django tiene a built-in template filtertimesince que ofrece la misma salida que mencionó anteriormente. El siguiente filtro despoja a la segunda parte después de la coma:

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

Debe duplicar su django.contrib.humanize.templatetags.humanize.py a myapp.templatetags.myhumanize y modificarlo según sus necesidades. (No puedo encontrar la línea actual que devuelve "x días, hace horas". ¿Qué versión de django/humanize está usando?)

+3

recomendaría contra códigos copiar y modificarlo. Eso podría romper cosas de versiones más nuevas. – Darioush

0

Ahora también puede utilizar un ExpressionWrapper o Caso/Al que utilizará el conjunto de consultas de bases de datos y dar formato a él directamente.

Ejemplo de salida, en combinación con el día/días pluralized de la parte superior de mi cabeza:

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