2011-06-27 34 views
12

Khi tôi làm điều này:Làm thế nào để hiển thị "x ngày trước" loại thời gian bằng cách sử dụng Humanize trong mẫu Django?

{% load humanize %} 

{{ video.pub_date|naturaltime|capfirst }} 

tôi nhận được 2 days, 19 hours ago

Làm thế nào tôi có thể nhận được chỉ là 2 ngày mà không có giờ. Về cơ bản nếu video được xuất bản trong vòng chưa đầy một ngày trước thì nó phải nói X giờ trước, sau đó nó sẽ được tính vào những ngày như X ngày trước, sau đó trong vài tuần. Tôi chỉ không muốn 1 giờ 5 phút trước hoặc 2 ngày 13 phút trước. Chỉ là phần đầu tiên.

Tôi đã xem xét tài liệu nhân bản nhưng không thể tìm thấy những gì tôi cần.

Trả lời

24

Django có a built-in template filtertimesince cung cấp cùng sản lượng bạn đã đề cập ở trên. Bộ lọc sau chỉ dải phần thứ hai sau dấu phẩy:

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

Bạn nên sao chép django.contrib.humanize.templatetags.humanize.py vào myapp.templatetags.myhumanize và sửa đổi nó theo nhu cầu của bạn. (Tôi không thể tìm thấy dòng thực tế trả về "x ngày, y giờ trước". Bạn đang sử dụng phiên bản django/humanize nào?)

+3

Tôi muốn giới thiệu chống lại các mã sao chép và sửa đổi nó. Điều đó có thể phá vỡ nội dung từ các phiên bản mới hơn. – Darioush

0

Bạn cũng có thể bây giờ sử dụng một ExpressionWrapper hoặc xách/Khi điều đó sẽ sử dụng các queryset và cơ sở dữ liệu để định dạng nó trực tiếp.

Ví dụ đầu ra, trong combo với ngày/ngày thành số nhiều ra khỏi đỉnh đầu của tôi:

overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField()) 
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue) 
Các vấn đề liên quan