Django模板ifequal变量与timesince过滤器的比较

时间:2015-02-09 18:39:32

标签: django-templates django-template-filters

我正在使用Django模板语言输出有关最近访问者在页面上的操作的信息。

目标是创建一个ifequal条件语句来输出一个列表,显示自上次5个操作的操作以来的时间。对于任何显示“0分钟”的内容,我们希望显示“不到一分钟前”。

现在看来,ifequal条件语句对我不起作用。

我尝试了以下内容:

  • 检查{{j}}输出为“0分钟”或页面上的其他时间
  • 使用X {{j}} X输出变量以查看是否有任何空格(没有空格)
  • 在变量和输出中添加了“| timesince”过滤器。没有区别。
  • 我尝试在{{j.strip}}上使用“.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 %}

3 个答案:

答案 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 %}