我们将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)
我希望它以每种语言显示这些格式的日期。我该怎么做?
更新:我发现可以在此链接中覆盖每个语言环境的格式,并为en和he语言环境添加了格式,但是它们不起作用。我添加了一个调试代码,您可以在这里看到,但是它不起作用。它显示的日期不像Jan. 1, 2018我预期的那样。
我也不知道模板中是否DATE_FORMAT应该在它之前settings.,但是没有它,它什么也不会显示。
如果在特定语言环境中未定义这些格式之一,或者对于我根本未定义的语言环境,我也想保留默认设置。
覆盖语言环境的方式看起来不错。问题在于您如何在模板中指定格式:
{{ 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过滤器在当前语言环境中查找适当的格式,并将其应用。文档中的示例暗示了您需要在此处传递字符串的事实,但并未明确指出。
\n\n\n\n\n如果这些格式之一未在特定区域设置中定义,或者对于我根本没有定义的区域设置,我还想保留默认设置。
\n
\n\n\n据我所知,您只能选择、
\nDATE_FORMAT或-我认为不可能指定您自己的格式,除非您对实际格式进行硬编码(这样就不会随区域设置而改变) 。\xe2\x80\x93DATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT太阳烟
您可以修补,django.utils.formats.FORMAT_SETTINGS以便它会出现在您的 Django 设置中:
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)\nRun Code Online (Sandbox Code Playgroud)\n\n在您的DJANGO_SETTINGS_MODULE(或者,如果是 Speedy Net,则为speedy/core/settings/base.py):
YEAR_FORMAT = \'Y\'\n\nFORMAT_SETTINGS = (\n \'YEAR_FORMAT\',\n)\nRun Code Online (Sandbox Code Playgroud)\n\n它只需要运行一次即可应用于所有视图(模板),因此我将其放入speedy/core/patches/locale_patches.py def patch并locale_patches.patch() 调用wsgi.py。
\n\n\n但问题是我必须修补 14 个文件,因为测试失败,我也必须修补测试。您可以看到我的提交https://github.com/speedy-net/speedy-net/commit/f5dc4896c136a816ab9fe0dc360d3fd59d0a5f33。是否可以在不修补这么多文件的情况下应用此功能?
\n
我找到了另一种方法:https ://docs.djangoproject.com/en/2.2/ref/applications/#configuring-applications
\n\nspeedy/core/apps.pyAppConfig中的子类:
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()\nRun Code Online (Sandbox Code Playgroud)\n\n将指向该子类的虚线路径放入speedy/core/settings/base.pyINSTALLED_APPS中:
INSTALLED_APPS = [\n ...\n\n \'speedy.core.apps.SpeedyCoreConfig\', # Add this line\n \'speedy.core.base\',\n ...\n]\nRun Code Online (Sandbox Code Playgroud)\n