我正在使用Django模板语言输出有关最近访问者在页面上的操作的信息。
目标是创建一个ifequal条件语句来输出一个列表,显示自上次5个操作的操作以来的时间。对于任何显示“0分钟”的内容,我们希望显示“不到一分钟前”。
现在看来,ifequal条件语句对我不起作用。
我尝试了以下内容:
感谢您提供的任何帮助或建议!
{% 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 %}
答案 0 :(得分:1)
{% ifequal a b %}
似乎在django模板中已弃用。优先使用{% if a == b %}
。
timesince过滤器需要datetime类型作为输入。例如:
{{ created_dttm.strftime("%Y-%m-%d %H:%M:%S") }}
将输出“2015-02-09 11:52:09”
{{ created_dttm|timesince }}
将输出“0分钟”
Ergo,如果a.created_at
是一个日期时间,就像使用时间片过滤器一样,你可能最好不要在条件中比较日期时间而不是比较一个字符串。 e.g。
{% 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分钟”之类的相对字符串可能不是最好的设计。请考虑使用日期时间,并仅在表示层中转换为字符串。
python日期和时间操作可以是巴洛克式的。我们正在使用箭头库来平滑它:http://crsmithdev.com/arrow/
答案 1 :(得分:1)
这是因为&#34; 0分钟&#34;由timesince / timeuntil返回的内容中有一个不间断的空格,所以它不等于你的文字。 (看看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
答案 2 :(得分:0)
感谢@ AJ-Slater的回答,它有助于看到比较日期时间而不是过滤器的输出更好。我们尝试使用&#34; sub&#34;数学过滤器并不适用于这个特定的CRM,但ifequal语句的工作原理是{% ifequal a.created_at|timesince a.created_at|timeuntil %}
。