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

Django templates Django模板ifequal变量与timesince过滤器的比较,django-templates,django-template-filters,Django Templates,Django Template Filters,我使用Django模板语言在页面上输出关于最近访问者行为的信息 目标是创建一个ifequal条件语句,以输出一个列表,显示最近5个操作的自操作以来的时间。对于任何显示“0分钟”的内容,我们希望显示“不到一分钟前” 现在看来ifequal条件语句对我不起作用 我尝试了以下方法: 检查{j}是否输出到页面上的“0分钟”或其他时间量 用X{{j}}X输出变量以查看是否有空白(没有) 在变量和输出中添加了“| timesince”过滤器。没有区别 我尝试在{j.strip}上使用“.strip”方法,

我使用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 %}

{%ifequal a b%}
在django模板中似乎已被弃用。如果a==b%}最好使用{
%

timesince筛选器需要datetime类型作为输入。例如:

{{created_dttm.strftime(“%Y-%m-%d%H:%m:%S”)}
将输出“2015-02-09 11:52:09”

{{created|dttm | timesince}}
将输出“0分钟”

因此,如果
a.created\u at
是一个日期时间,这对于使用时间片过滤器是合适的,那么您最好在条件中比较该日期时间,而不是比较字符串。e、 g

{% if datetime.datetime.now() - datetime.timedelta(minutes=1) < j %}
  Less than a minute ago
{% else %}
  {{ j|timesince }}
{% endif %}`
{%if datetime.datetime.now()-datetime.timedelta(分钟=1)
如果
a.created\u at
确实是一个字符串,正如您在问题中提到的,那么使用timesince过滤器是不合适的。我将尝试查看
{%if a.created_at==“0分钟”%}

另外,在表示层之外将日期时间存储为相对字符串(如“5分钟”)可能不是最好的设计。考虑使用DeaTimes而只在表示层中转换为字符串。


python日期和时间操作可以是巴洛克风格的。我们使用箭头库来解决这个问题:

感谢@AJ Slater的回答,它帮助我们看到比较日期时间比比较过滤器的输出更好。我们尝试使用“sub”数学过滤器,该过滤器不适用于这个特定的CRM,但有效的是
{%ifequal a.created_at | timesince a.created_at | timeuntil%}
用于ifequal语句。

这是因为timesince/timeuntil返回的“0分钟”中有一个不间断的空格,因此它不等于您拥有的文本。(在
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