永久替换Django中的值

时间:2018-08-25 12:16:58

标签: python django replace

经过广泛的谷歌搜索,我仍然没有想出一种有效的方法来解决这个问题。

我正在使用Django创建网站。我有一个数据库,其中包含时间数据,更具体地说是日期。 “时间”的值设置为3000-01-01(YYYY-MM-DD),这是时间查询的常见做法。

我想做的是显示一个字符串,例如“ Now”或“ Present”或任何其他值,而不是日期3000-01-01。我可以在任何地方使用某种全局替代吗?在每个视图/模板中对其进行硬编码似乎很浪费。

干杯!

1 个答案:

答案 0 :(得分:0)

由于正在渲染,因此我建议不要对DateField进行“ 子类化”,以使其渲染'now'而不是原始的date(..)对象:它将使模型层中的计算更加麻烦。

解决这个问题的一种好方法是实现template filter [Django-doc],例如,我们可以构造一个文件:

#  app/templatetags/nowdate.py

from django import template

register = template.Library()

PRESENT = date(3000, 1, 1)

@register.filter
def nowdate(value):
    if value == PRESENT:
        return 'present'
    return value

templatetags应用程序的app目录中,还需要包含一个__init__.py文件(一个空文件),而app当然也必须是其中的一部分INSTALLED_APPSsettings.py中的第一个。

然后我们可以在模板中使用它,例如:

<!-- app/templates/app/some_template.html -->
{{ some_model.some_date_field|nowdate }}

因此,我们在这里获取some_date_field变量的some_model(此属性因此是date(..)对象),然后将其传递给我们构造的nowdate过滤器这样,如果它是3000-01-01,则将其替换为'present'字符串。

这里的优点是,如果我们以后改变对“出现”日期的看法,我们可以在模板过滤器中轻松更改它,此外,我们可以轻松地扩展它,例如通过添加一个'past''future'