0

我刚刚开始使用自定义模板标签。

我的forum_tags.py自定义模板模块中有以下代码:

from datetime import datetime, timedelta
from django import template
from django.utils.timesince import timesince

register = template.Library()

@register.filter
def time_until(value):
    now = datetime.now()
    try:
        difference = value - now
    except:
        return value

    if difference <= timedelta(minutes=1):
        return 'just now'
    return '%(time)s ago' % {'time': timesince(value).split(', ')[0]}

代码必须采用timesince模板标签返回的字符串,并仅返回其中的第一个值(由“,”分隔)。

在我的html文件中,我像这样使用它:

{% load forum_tags %}
<div class="started">
    <p>{{ obj.pub_date|timesince:forum_time|time_until }}</p>
</div>

但我仍然得到整个字符串。怎么了?

4

1 回答 1

1

基于更新的问题陈述:

我想要的只是获取“timesince”函数的输出(字符串),用逗号分割字符串并仅将 FIRST 值传递给模板。例如,由于返回“1 天,19 小时”,我只想得到“1 天”。

我认为最好的方法是将 Python 的内置split作为过滤器公开。一个简单的实现是:

@register_filter
def split(value, sep=None):
    return value.split(sep)

扩展以适应自定义过滤器的文档建议:

过滤器函数应该总是返回一些东西。他们不应该引发异常。他们应该默默地失败。如果出现错误,它们应该返回原始输入或空字符串——以更有意义的为准。

@register_filter
def split(value, sep=None):
    try:
        return value.split(sep)
    except:
        return value

我不喜欢except在任何代码中写一个毯子,但你无法控制value可能是什么(当你正确调用它时你期望它是什么),这是确保它静默失败的唯一方法。

first然后使用模板中的现有过滤器。

{% load forum_tags %}
<div class="started">
    <p>{{ obj.pub_date|timesince:forum_time|split:","|first }}</p>
</div>
于 2013-11-09T10:54:49.537 回答