【问题标题】:European date input in Django AdminDjango Admin中的欧洲日期输入
【发布时间】:2010-10-28 18:51:38
【问题描述】:

Django 有一个 DATE_FORMAT 和一个 DATE_TIME_FORMAT 选项,允许我们在查看日期时选择使用哪种格式,但显然不允许我在 Django Admin 中编辑或添加时更改日期的输入格式。

管理员的默认值为:YYYY-MM-DD

但使用起来会很棒:DD-MM-YYYY

这是否在任何情况下都集成在 i18n 中? 这可以在没有自定义模型的情况下更改吗?

【问题讨论】:

    标签: python django date django-admin


    【解决方案1】:

    自从Django ticket 6483 关闭和 Django 1.2 发布以来,现在有一种官方方法可以做到这一点。

    如果您将USE_L10N 设置为False,您应该在settings.py 中指定DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS。以下是我用于此的设置,基于转换默认值:

    #dd/mm/yyyy and dd/mm/yy date & datetime input field settings
    DATE_INPUT_FORMATS = ('%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', '%d %b %Y',
                          '%d %b, %Y', '%d %b %Y', '%d %b, %Y', '%d %B, %Y',
                          '%d %B %Y')
    DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S', '%d/%m/%Y %H:%M', '%d/%m/%Y',
                              '%d/%m/%y %H:%M:%S', '%d/%m/%y %H:%M', '%d/%m/%y',
                              '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d')
    

    如果您将USE_L10N 设置为True,则需要改用FORMAT_MODULE_PATH

    例如,我的LANGUAGE_CODE 设置为en-au,我的站点名为golf,我的FORMAT_MODULE_PATH 设置为golf.formats,所以我的目录结构如下所示:

    golf/
        settings.py
        ...
        formats/
            __init__.py
            en/
                __init__.py
                formats.py
    

    DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS 设置在 formats.py 而不是 settings.py

    【讨论】:

    • 帮了我大忙。谢谢!
    【解决方案2】:

    我已修改设置,使其禁用 l10n 并明确设置日期格式:

    USE_L10N = False
    DATE_FORMAT = 'd-m-Y'
    DATETIME_FORMAT = 'd-m-Y H:i'
    

    您也可以设置 DATE_INPUT_FORMATS。

    【讨论】:

      【解决方案3】:

      基于这个想法,我创建了新的 db.fields 类 EuDateField:

      mydbfields.py

      from django import forms
      from django.forms.fields import DEFAULT_DATE_INPUT_FORMATS
      from django.db import models
      
      class EuDateFormField(forms.DateField):
          def __init__(self, *args, **kwargs):
              kwargs.update({'input_formats': ("%d.%m.%Y",)+DEFAULT_DATE_INPUT_FORMATS})
              super(EuDateFormField, self).__init__(*args, **kwargs)
      
      class EuDateField(models.DateField):
          def formfield(self, **kwargs):
              kwargs.update({'form_class': EuDateFormField})
              return super(EuDateField, self).formfield(**kwargs)
      

      请注意,它首先将我的格式(例如 31.12.2007)添加到现有的“标准”django 格式中。

      用法:

      from mydbfields import EuDateField
      class Person(models.Model):
          ...
          birthday   = EuDateField("Birthday", null=True, blank=True, help_text="")
      

      在我的情况下,这在 admin 中表现良好,但很可能在 ModelForm 中也可以(还没有尝试过)。

      我的django版本是:

      >>> import django
      >>> django.get_version()
      u'1.1 alpha 1 SVN-10105'
      

      【讨论】:

      • 好的,这个解决方案很好,但我如何将它与 AdminDateWidget 一起使用?这个小部件是我的 MultiWidget 的一部分。
      【解决方案4】:

      您现在必须自己执行此操作,但使用设置 DateField 的 input_formats 参数的自定义表单字段类非常容易。应该这样做:

      class MyDateField(forms.DateField):
        def __init__(self, *args, **kwargs):
          kwargs.setdefault('input_formats', ("%d-%m-%Y",))
          super(MyDateField, self).__init__(*args, **kwargs)
      

      注意 input_formats 是一个列表,所以你可以指定多种可能性,它会在解析用户输入时按顺序尝试。

      【讨论】:

      • 我可以在我的新表单上应用它,但是,如何覆盖管理站点中的默认表单字段?
      【解决方案5】:

      据我了解,这似乎是 not yet supported,所以是的,您现在必须做一些自定义工作。

      【讨论】:

        【解决方案6】:

        注意不要把它写成一个字符串,而是一个元组。 例如:

        DATE_INPUT_FORMATS = ('%d.%m.%Y',) 
        

        如果您只想在表单中使用一种有效的日期书写方式。

        【讨论】:

          猜你喜欢
          • 2016-04-02
          • 2020-09-01
          • 1970-01-01
          • 2010-11-26
          • 1970-01-01
          • 2011-06-21
          • 2021-12-23
          • 2012-08-05
          • 2020-10-03
          相关资源
          最近更新 更多