Използвам езика за шаблони на 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.