【问题标题】:Specifying date format in Django templates with L10N for one language使用 L10N 在 Django 模板中为一种语言指定日期格式
【发布时间】:2019-06-02 07:23:08
【问题描述】:

在 Django 模板中,我显示的日期如下:

{{ article.published_at|date }}

显示如下:

十一月2018 年 2 月 21 日

我想改变这种格式,但是

  • 我正在使用本地化,所以我不想在模板中指定特定的日期格式——每种语言都有自己的日期显示方式。

  • L10N 设置为True 时,Django DATE_FORMAT 设置does not have any effect

那我该怎么办:

  1. 如果当前语言为英语 (en),请为此日期使用不同的格式
  2. 当不是en时使用当前语言的默认日期格式

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    这是我最终用来替代内置 date filter 的过滤器。

    # myapp/templatetags/my_filters.py
    from django import template
    from django.conf import settings
    from django.template.defaultfilters import date
    from django.utils import dateformat
    from django.utils.translation import get_language
    
    register = template.Library()
    
    @register.filter(expects_localtime=True, is_safe=False)
    def format_date(value):
        if value in (None, ''):
            return ''
    
        language_code = get_language()
    
        if language_code == 'en':
            # Language is English, so use the format defined in settings:
            return dateformat.format(value, settings.DATE_FORMAT)
        else:
            # Language is not English, so use language-specific default:
            return date(value)
    

    我使用settings.py 中的普通DATE_FORMAT Django 设置来设置自定义日期格式:

    DATE_FORMAT = 'j F Y'
    

    如果当前语言是英语,则使用此选项。否则使用当前语言的默认值。

    像这样使用它:

    {% load my_filters %}
    
    {{ article.published_at|format_date }}
    

    您可以扩展它以提供其他语言的自定义格式,但这就是我现在所需要的。

    我仍然希望有一种方法可以在设置中定义每种语言的日期格式,所以我仍然觉得我错过了一种更简单的方法......

    【讨论】:

      【解决方案2】:

      您的模板是否包含{% load l10n %} 标签? 您可以使用上面的标签和

      指定日期格式

      例如,如果您正在寻找要显示的日期,例如: 2020 年 1 月 13 日

      你会做: your_date|date:'n/j/Y'

      Link to the docs for builtins |date

      当它已经存在时,你自己的滚动没有多大意义,但建议考虑在上下文中添加date_format="n/j/Y"。那么你就可以恰到好处了:

      {{ item.date_end|date:date_format }}

      然后您将不会在模板中指定格式,此外,如果它在任何地方都使用,您可以创建一个上下文处理器来定义它,以便它包含在每个渲染中。因此,在整个站点范围内更改变得非常容易。

      Create your own context processor

      【讨论】:

      • 它没有。我试过添加它,但它本身并没有什么不同。
      • 尝试指定LANGUAGE_CODE(记住它还需要USE_I18N = True)。如果您希望您的应用动态确定语言偏好,请查看LocaleMiddleware
      • 对不起,我不明白你的意思。整个网站在多种语言中运行良好,带有翻译,用户可以在语言版本之间切换。
      • 哦,那好吧。我误解了您的问题,并以某种方式假设您在新应用程序中设置本地化时遇到问题。您可以指定日期在模板中的显示方式,如{{ value|date:"D d M Y" }} (check docs)。如果您想为每种语言自定义它,您可以将 django.utils.translation.get_language() 传递给模板上下文并使用简单的条件块。这是你的问题吗?
      • 我不知道如何比问题中的第 1 点和第 2 点更好地描述问题。我不想每次显示日期时都在模板中使用条件。我想我必须编写自己的模板过滤器,但我想可能会错过一些更简单的东西。
      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 2016-03-23
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多