Django-如何覆盖每个语言环境的默认日期格式?

Uri*_*Uri 4 python django

我们将Django 1.11用于Speedy Net。我想重写的默认值DATE_FORMAT,并MONTH_DAY_FORMAT在希伯来语中英文,但保留默认值(或重新定义它们)。因此,它们将与Django的默认值不同并且也不相同。用英语,我们将有:

DATE_FORMAT = 'j F Y'
MONTH_DAY_FORMAT = 'j F'
YEAR_FORMAT = 'Y'
Run Code Online (Sandbox Code Playgroud)

在希伯来语中:

DATE_FORMAT = 'j ?F Y'
MONTH_DAY_FORMAT = 'j ?F'
Run Code Online (Sandbox Code Playgroud)

(并且YEAR_FORMAT将是相同的)。

该模板当前如下所示:

{% if can_view_profile and user.date_of_birth %}
    {% if can_view_dob_day_month or can_view_dob_year %}
        <tr>
            <th>{% if can_view_dob_day_month %}{% trans 'Birth Date' %}{% elif can_view_dob_year %}{% trans 'Birth Year' %}{% endif %}</th>
            <td>
                {% if can_view_dob_day_month and can_view_dob_year %}
                    {{ user.date_of_birth|date:settings.DATE_FORMAT }}
                {% elif can_view_dob_day_month %}
                    {{ user.date_of_birth|date:settings.MONTH_DAY_FORMAT }}
                {% elif can_view_dob_year %}
                    {{ user.date_of_birth|date:settings.YEAR_FORMAT }}
                {% endif %}
            </td>
        </tr>
    {% endif %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我希望它以每种语言显示这些格式的日期。我该怎么做?

更新:我发现可以在此链接中覆盖每个语言环境的格式,并为enhe语言环境添加了格式,但是它们不起作用。我添加了一个调试代码,您可以在这里看到,但是它不起作用。它显示的日期不像Jan. 1, 2018我预期的那样。

我也不知道模板中是否DATE_FORMAT应该在它之前settings.,但是没有它,它什么也不会显示。

如果在特定语言环境中未定义这些格式之一,或者对于我根本未定义的语言环境,我也想保留默认设置。

sol*_*oke 5

覆盖语言环境的方式看起来不错。问题在于您如何在模板中指定格式:

{{ user.date_of_birth|date:settings.DATE_FORMAT }}
Run Code Online (Sandbox Code Playgroud)

我不确定settings来自哪里,但是在任何情况下都行不通-它会使用您在主设置文件中定义的格式(如果这是传递给模板上下文的内容),并且不会本地化。您需要传递一个字符串,该字符串描述您要使用的格式

{{ user.date_of_birth|date:"DATE_FORMAT" }}
Run Code Online (Sandbox Code Playgroud)

这将使date过滤器在当前语言环境中查找适当的格式,并将其应用。文档中的示例暗示了您需要在此处传递字符串的事实,但并未明确指出。


aar*_*ron 1

定义默认日期格式

\n\n
\n

如果这些格式之一未在特定区域设置中定义,或者对于我根本没有定义的区域设置,我还想保留默认设置。

\n
\n\n\n\n
\n

据我所知,您只能选择、DATE_FORMAT或-我认为不可能指定您自己的格式,除非您对实际格式进行硬编码(这样就不会随区域设置而改变) 。\xe2\x80\x93DATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT太阳烟

\n
\n\n

您可以修补,django.utils.formats.FORMAT_SETTINGS以便它会出现在您的 Django 设置中:

\n\n
from django.conf import settings as django_settings\nfrom django.utils import formats\n\nformats.FORMAT_SETTINGS = formats.FORMAT_SETTINGS.union(django_settings.FORMAT_SETTINGS)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在您的DJANGO_SETTINGS_MODULE(或者,如果是 Speedy Net,则为speedy/core/settings/base.py):

\n\n
YEAR_FORMAT = \'Y\'\n\nFORMAT_SETTINGS = (\n    \'YEAR_FORMAT\',\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

关于补丁

\n\n

它只需要运行一次即可应用于所有视图(模板),因此我将其放入speedy/core/patches/locale_patches.py def patchlocale_patches.patch() 调用wsgi.py

\n\n
\n

但问题是我必须修补 14 个文件,因为测试失败,我也必须修补测试。您可以看到我的提交https://github.com/speedy-net/speedy-net/commit/f5dc4896c136a816ab9fe0dc360d3fd59d0a5f33。是否可以在不修补这么多文件的情况下应用此功能?

\n
\n\n

我找到了另一种方法:https ://docs.djangoproject.com/en/2.2/ref/applications/#configuring-applications

\n\n

speedy/core/apps.pyAppConfig中的子类:

\n\n
from django.apps import AppConfig\n\nfrom .patches import locale_patches\n\n\nclass SpeedyCoreConfig(AppConfig):\n    name = \'speedy.core\'\n\n    def ready(self):\n        locale_patches.patch()\n
Run Code Online (Sandbox Code Playgroud)\n\n

将指向该子类的虚线路径放入speedy/core/settings/base.pyINSTALLED_APPS中:

\n\n
INSTALLED_APPS = [\n    ...\n\n    \'speedy.core.apps.SpeedyCoreConfig\',  # Add this line\n    \'speedy.core.base\',\n    ...\n]\n
Run Code Online (Sandbox Code Playgroud)\n