我刚开始使用自定义模板标记。
我的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>
但我仍然得到整个字符串。 怎么了?
答案 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>