从当前函数创建模板标记

时间:2017-03-30 13:59:04

标签: python django templatetags

我已在python-for-android文件中正式构建了该函数:

models.py

我知道Django的模板语言不是Python,所以我们不能写from datetime import datetime from django.template.defaultfilters import date as datefilter from django.utils import translation def date_customerprofile(language): now_ = datetime.today() if language == 'English': translation.activate('en') return datefilter(now_, 'l, F j, Y') else: translation.activate('fr') return datefilter(now_, 'l, j F Y')

此处的解决方案是创建自定义模板标签。另请注意,{{ customer.date_customerprofile('French') }}将更改剩余请求/响应周期的活动语言 - 使用translation.activate上下文管理器肯定是一个更好的主意。由于我不是模板标签的专家,任何人都可以告诉我如何在考虑上述功能的情况下创建它?

我认为我们可以使用以下问题来做这样的事情How to format date in different languages?

我可以使用上下文管理器:Django switching, for a block of code, switch the language so translations are done in one language吗?

谢谢!

事实上,我想在模板中返回当前日期的法语'Jeudi,30 mars 2017'或当前日期英语translation.override

P.S。请告诉我这个问题是否不清楚。

这是Django模板的一个例子:

Thursday, March 30, 2017

1 个答案:

答案 0 :(得分:1)

现在我们已经看到了完全无意义的答案,这里是严肃的答案:

yourapp/templatetags/yourapptags.py模块中:

from django import template
register = template.Library()

DATE_FORMATS = {
    "en":  "l, F j, Y",
    "fr": "l, j F Y"
}

DEFAULT_LANG = 'fr'

@register.simple_tag
def localdate(lang=DEFAULT_LANG):
    fmt = DATE_FORMATS.get(lang, DATE_FORMATS[DEFAULT_LANG])
    now = datetime.now()
    with translation.override(lang):
        return datefilter(now, fmt)

然后在你的模板中:

{% load "yourapptags" %}

<p>EN : {% localdate 'en' %}</p>
<p>FR : {% localdate 'fr' %}</p>

请注意,这是为了强制在给定语言环境中的日期格式化/本地化,无论当前语言环境是什么,在这种情况下对我来说似乎很奇怪。

如果您真正想要的只是显示根据当前访问者的语言环境格式化的当前日期(参见https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#how-django-discovers-language-preference),您可以删除lang参数并使用{{1}而不是:

translation.get_language()

另请注意,Django提供的l10n格式文件已经有some date formats defined and that you can override them