针对特定类型的所有变量的 django 模板过滤器

Posted

技术标签:

【中文标题】针对特定类型的所有变量的 django 模板过滤器【英文标题】:django template filter for all variables of specific type 【发布时间】:2015-09-20 15:25:43 【问题描述】:

在 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 以及模板中的所有其他变量都表示要使用名为 jalali_date 的过滤器过滤的日期。这会将日期格式化为我想要的。

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

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

【问题讨论】:

我假设你已经从 django 搜索了现有的内置模板标签。我建议您阅读有关创建自定义模板标签here 【参考方案1】:

如果您想通过自定义过滤器来实现这一点,请阅读过滤器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)

然后在模板中你可以像下面这样使用它(假设模板标签文件名是jdate):

% load jdate %
...
 publish_date|jalali_date 
...

但如果你想自动识别和更改某些类型的值,你必须使用MiddleWares(不是过滤器),阅读关于自定义MiddleWarehere的sn-p代码。

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

【讨论】:

我知道如何编写自定义过滤器。我在帖子中添加了更多关于我想要做什么的详细信息 我已经写好了 jalali_date。我应该如何将它应用于我的模板中的所有日期变量?这是我的问题 您已经写过它可以使用中间件来完成。你能解释一下吗? 在我的回答中的相关链接中阅读有关中间件的更多信息。 我读到了中间件。但我仍然看不到我想要的东西怎么能做到。

以上是关于针对特定类型的所有变量的 django 模板过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Django模板层 (变量分配 过滤器 标签 继承和导入 自定义过滤器标签及inclusion_tag(了解))

如何在默认过滤器中使用 django 变量作为文本

Django 模板渲染

django:使用没有 unicode 'u' 类型指示符的安全过滤器渲染变量

Djnago模板与标签

Django模板之模板变量过滤器