django模板过滤器用于特定类型的所有变量

时间:2015-07-02 22:35:26

标签: python django django-templates django-template-filters

在Django中,我想在我的所有模板中使用特定过滤器来处理特定类型的所有变量。

例如,假设我想使用过滤器,根据用户设置,如果需要,可以将日期转换为Jalali日历。在这种情况下,我希望此过滤器应用于我在我的模板中使用的所有变量,这些变量是日期。

我有一个名为base.html的模板,我的所有模板都扩展了它。

如何实现这一目标?

更新:我将使用一个示例来阐明我想要做的事情。

我有一个名为Post的模型,其中包含名为publish_date的字段。某事。像这样。

class Post(models.Model):
    title = models.CharField()
    content = models.TextField()
    publish_date = models.DateTimeField(auto_now_add=True)

现在,当我使用模板输出帖子时,我希望我的所有帖子publish_date以及模板中的所有其他变量代表使用名为{{的过滤器过滤的日期1}}。这将把日期格式化为我想要的。

我知道如何使用自定义标签和过滤器,但我不知道如何完成某事。像这样使用它们(如果可以使用它们这样做)。

更新2 : 只是为了更清楚:我已经编写了jalali_date过滤器。问题是如何将其自动应用于我的模板中作为日期的所有变量。

1 个答案:

答案 0 :(得分:2)

如果您想通过自定义过滤器实现此功能,请阅读有关过滤器here的信息,下面的代码也可以为您提供帮助:

import datetime, time

from django import template
import khayyam

register = template.Library()

def jalali_date(date):
    """Converts Date into JalaliDate"""
    timestamp = time.mktime(datetime.datetime.timetuple(date))
    jalali_date = khayyam.JalaliDate.fromtimestamp(timestamp)
    return str(jalali_date)

register.filter('jalali_date', jalali_date)

然后在模板中你可以使用它类似下面(假设templatetag文件nam是jdate):

{% load jdate %}
...
{{ publish_date|jalali_date }}
...

但如果您想自动识别并更改某些类型的值,则必须使用MiddleWares(不是过滤器),请阅读有关自定义MiddleWare {{3的代码段}}

注意:要使用非内置过滤器,您必须在INSTALLED_APPS中添加容器应用。