无法获得自定义模板标记

时间:2013-11-09 10:37:14

标签: python django django-templates

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

我的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>

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

1 个答案:

答案 0 :(得分:1)

基于更新的问题陈述:

  

我想要的只是获取“timesince”函数的输出(字符串),用逗号分隔字符串并仅将FIRST值传递给模板。例如。 timesince返回“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>