Отображение метки времени в шаблоне django

мне нужно отобразить временную метку сообщения с шаблоном в django. Метка времени будет выглядеть так:

"timestamp":1337453263939 in milli seconds

Я могу преобразовать временную метку в объект datetime и отобразить ее в представлении. Есть ли какой-либо прямой способ отображения через шаблон? Вывод должен быть:

print(datetime.datetime.fromtimestamp(1337453263.939))
2012-05-20 00:17:43.939000

5 ответов


вы можете использовать пользовательские фильтры шаблонов (см. https://docs.djangoproject.com/en/dev/howto/custom-template-tags/). В вашем случае это может выглядеть так:

  1. создать каталог "templatetags" в приложении с видом, который отображает шаблон.
  2. поместите в этот пустой файл dir "__init__.py " и "timetags.py-с кодом:

    from django import template
    import datetime
    register = template.Library()
    
    def print_timestamp(timestamp):
        try:
            #assume, that timestamp is given in seconds with decimal point
            ts = float(timestamp)
        except ValueError:
            return None
        return datetime.datetime.fromtimestamp(ts)
    
    register.filter(print_timestamp)
    
  3. в шаблоне, добавьте

    {% load timetags %}
    
  4. использовать следующий синтаксис в шаблоне:

    {{ timestamp|print_timestamp }}
    

    где отметка времени = 1337453263.939 из вашего примера

это будет печатать метку времени в локальном формате даты и времени. Если вы хотите настроить выход, вы можете изменить print_timestamp следующим образом:

import time
def print_timestamp(timestamp):
    ...
    #specify format here
    return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(ts))

{% now "U" %}

на "U" - это формат даты для эпохи Unix, а также может использоваться со встроенным date. Поэтому, если у вас есть дата в переменной:

{{ value|date:"U" }}

возможно, вы можете использовать фильтр даты: https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#date


Я не думаю, что фильтр даты принимает временные метки, поэтому, если я не контролирую фильтр, вы можете просто создать его?

# python
from datetime import datetime

# django
from django import template


register = template.Library()

@register.filter("timestamp")
def timestamp(value):
    try:
        return datetime.fromtimestamp(value)
    except AttributeError, e:
        catch errors..

просто напишите пользовательский фильтр, который преобразует строку метки времени в объект datetime. Затем вы можете либо дополнительно обработать его во что-то читаемое (строка, представляющая ваше время) и вернуть его в шаблон, либо просто вернуть объект Python datetime и использовать фильтр даты django.

таким образом, у вас может быть что-то вроде этого {{ timestamp_string|convert_to_datetime|date:'D d M Y' }}

подробнее по этому вопросу на: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/