/ / Django template ifequal сравнение на променливи с филтър timesince - django-templates, django-template-filters

Django шаблон, ако е подходящо променливо сравнение с timestimes филтър - django-шаблони, django-шаблон-филтри

Използвам езика за шаблони на Django, за да извеждам информация за действията на последния посетител на дадена страница.

Целта е да се създаде ifequal условнозаявление за извеждане на списък, показващ времето от действието за последните 5 действия. За всичко, което показва "0 минути", бихме искали да покажем "Преди по-малко от минута".

В момента изглежда, че ifequal условно изявление не работи за мен.

Опитах следното:

  • Проверете дали {{j}} извежда на "0 минути" или друг период от време на страницата
  • Посочи променливата с X {{j}} X, за да видим дали има някакви бели пространства (няма такива)
  • Добавен е филтър "| timesince" в променливата, както и към изхода. Няма разлика там.
  • Опитах се да използвам метода ".strip" на {{j.strip}}, който напълно разби страницата.

Оценявайте всяка помощ или съвет, които можете да дадете!

{% for a in page.recent_actions | slice:":5" %}

{% with j=a.created_at %}

{% ifequal j|timesince "0 minutes" %}
Less than a minute ago
{% else %}
{{ j|timesince }}
{% endifequal %}
{% endwith %}
{% endfor %}

Отговори:

1 за отговор № 1

{% ifequal a b %} изглежда, че е остаряла в django шаблони. Използването на {% if a == b %} се предпочита.

Филтърът timesince изисква въвеждане на тип дата. Например:

{{ created_dttm.strftime("%Y-%m-%d %H:%M:%S") }} ще излезе "2015-02-09 11:52:09"

{{ created_dttm|timesince }} ще изведе "0 минути"

Да, ако a.created_at е datetime, както би било подходящо за използване на филтъра timelice, който може да е по-добре да сравните този datetime в условния, а не да сравните низ. например

{% if datetime.datetime.now() - datetime.timedelta(minutes=1) < j %}
Less than a minute ago
{% else %}
{{ j|timesince }}
{% endif %}`

ако a.created_at наистина е низ, както напомняте във въпроса си, а след това използването на филтъра timesince е неподходящо. Ще се опитам да видя дали {% if a.created_at == "0 minutes" %}.

Също така съхраняване на данни като относителни низове"5 минути" извън слоя за презентации вероятно не е най-големият дизайн. Помислете да използвате вместо това числа от данни и да конвертирате в низове само в слоя за презентации.

датите на питон и манипулирането на времето могат да бъдат барокови. Използваме библиотеката със стрелки, за да изгладим това: http://crsmithdev.com/arrow/


1 за отговор № 2

Това се дължи на факта, че "0 минути", върнати от timesince / timeuntil, има неразрушаващо пространство в него, така че не е равно на литерала, който имате. (погледнете нейното прилагане през 2007 г. \ t django.utils.timesince.py

Една от опциите е да се напише персонализиран маркер, който се възползва от timesince / timeuntil, но сравнява низ с непрекъснато пространство, когато тези функции се върнат:

from django import template
from django.utils.html import avoid_wrapping
from django.utils.translation import ugettext
from django.utils.timesince import timeuntil

register = template.Library()

@register.filter("is_past", is_safe=False)
def is_past(value, arg=None):
"""Returns true if a timestamp is in the past."""
if not value:
return False
try:
return timeuntil(value, arg) == avoid_wrapping(ugettext("0 minutes"))
except (ValueError, TypeError):
return False

0 за отговор № 3

Благодарение @ AJ-Slater за отговора, той помогнавиждам, че е по-добре да се сравняват времената, а не изходните от филтрите. Опитахме се да използваме "под" математическия филтър, който не работеше с тази конкретна CRM, но това, което вършеше работа, беше {% ifequal a.created_at|timesince a.created_at|timeuntil %} за изявление ifequal.