33👍
Django has a built-in template filter timesince
that offers the same output you mentioned above. The following filter just strips the second part after the comma:
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]}
3👍
There is naturaltime
in modern django.
Given now
is 17 Feb 2007 16:30:00
.
It changes 16 Feb 2007 13:31:29
to 1 day, 2 hours ago
.
{# some_template.html #}
{% load humanize %}
{{ past_time | naturaltime }}
https://docs.djangoproject.com/en/2.2/ref/contrib/humanize/#naturaltime
- Django is very slow on my machine
- Can Django run on Gunicorn alone (no Apache or nginx)?
- Django database synchronization for an offline usage
- Django's get_current_language always returns "en"
- Error loading MySQLdb module: libmysqlclient.so.20: cannot open shared object file: No such file or directory
2👍
You should duplicate your django.contrib.humanize.templatetags.humanize.py to myapp.templatetags.myhumanize and modify it to your needs. (I can’t find the actual line that returns “x days, y hours ago”. Which version of django/humanize are you using?)
0👍
You can also now use an ExpressionWrapper or Case/When that will utilize the queryset and database to format it directly.
Example output, in combo with day/days pluralized off the top of my head:
overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField())
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue)