首页 文章

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

提问于
浏览
1

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

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

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

我尝试过以下方法:

  • 检查{}输出到"0 minutes"或页面上的其他时间

  • 使用X {} X输出变量以查看是否有任何空格(没有空格)

  • 在变量和输出中添加了"|timesince"过滤器 . 没有区别 .

  • 我尝试在{}上使用".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 回答

  • 1

    似乎在django模板中不推荐使用 {% ifequal a b %} . { % if a == b %} 的使用是首选 .

    timesince过滤器需要datetime类型作为输入 . 例如:

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

    {{ created_dttm|timesince }} 将输出"0 minutes"

    因此,如果 a.created_at 是一个日期时间,因为适合使用时间片过滤器,您最好在条件中比较日期时间而不是比较字符串 . 例如

    {% 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/

  • 0

    这是因为timesince / timeuntil返回的"0 minutes"在其中有一个不间断的空格,因此它不等于你的文字 . (看看 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
    
  • 1

    感谢@ AJ-Slater的回答,它有助于看到比较日期时间而不是过滤器的输出更好 . 我们尝试使用"sub"数学过滤器,该过滤器不适用于此特定CRM,但ifequal语句的工作原理是 {% ifequal a.created_at|timesince a.created_at|timeuntil %} .

相关问题