【问题标题】:How to format DateTimeField in Django Admin to localtime?如何将 Django Admin 中的 DateTimeField 格式化为本地时间?
【发布时间】:2012-11-08 08:12:21
【问题描述】:

如何根据本地时间和时区在 Admin 中格式化 DateTimeField ?

我的设置.py:

    TIME_ZONE = 'Europe/Bratislava'
    LANGUAGE_CODE = 'en-us'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True

pytz 包已安装。

型号:

class Material(models.Model):
    category = models.ForeignKey(Category, null=True, blank=True) 
    code = models.CharField(max_length=10)
    description = models.CharField(max_length=30, blank=True, null=True)
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

还在设置中尝试了一些日期格式,这些都没有改变日期时间对象在管理列表显示中转换为字符串的方式:

DATETIME_FORMAT = 'd N Y'
DATE_FORMAT = 'd N Y'

在数据库中正确存储日期时间,“2012-11-20 08:57:15.901341+01”。但在管理员中显示时,它始终是 UTC。

我可以在 ModelAdmin 中准备方法来处理格式,但这并不真正 DRY,因为我希望我的管理类看起来像这样:

from django.utils.timezone import localtime

class MaterialAdmin(admin.ModelAdmin):
    list_display = ('code', 'modified_local', 'created')

    def modified_local(self, row):
        return localtime(row.modified)
    modified_local.admin_order_field = 'modified'
    modified_local.short_description = 'Modified'

【问题讨论】:

  • pyshell 中from django.utils.formats import localize; localize(localtime(row.modified)) 的输出是什么?
  • >>> row.modified datetime.datetime(2012, 11, 20, 7, 57, 15, 901000, tzinfo=) >>> localize(localtime(row.modified))十一月2012 年 2 月 20 日上午 8 点 57 分'
  • @Edke 定义属性如方法的解决方案很差,是一种糟糕的设计模式。看看我的解决方案/配置。

标签: django django-admin django-timezone


【解决方案1】:

您的问题的答案是在 Django 项目中正确配置 settingsformats。示例项目结构:

.
|-- README.md
|-- demo.db
|-- demo_time_set
|   |-- __init__.py
|   |-- demo.db
|   |-- formats
|   |   |-- __init__.py
|   |   `-- en
|   |       |-- __init__.py
|   |       `-- formats.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- manage.py
|-- requirments.txt
`-- some_app
    |-- __init__.py
    |-- admin.py
    `-- models.py

您可以为多种语言定义它,只需在其中提供具有适当名称和格式的目录。py。 MAGIC 发生的formats.py 的示例内容如下所示:

# HERE FORMATING AS shown in:
# LIST: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = 'd-m-Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'd-m-Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'F j'
SHORT_DATE_FORMAT = 'm/d/Y'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
FIRST_DAY_OF_WEEK = 1

# BUT here use the Python strftime format syntax,
# LIST: http://docs.python.org/library/datetime.html#strftime-strptime-behavior

DATE_INPUT_FORMATS = (
    '%d-%m-%Y',     # '21-03-2014'
)
TIME_INPUT_FORMATS = (
    '%H:%M:%S',     # '17:59:59'
    '%H:%M',        # '17:59'
)
DATETIME_INPUT_FORMATS = (
    '%d-%m-%Y %H:%M',     # '21-03-2014 17:59'
)

DECIMAL_SEPARATOR = u'.'
THOUSAND_SEPARATOR = u','
NUMBER_GROUPING = 3

请注意 cmets 中的两个链接,它们将引导您找到正确配置的列表,这些配置因不同的部件而异!

在您的settings.py 中添加:

FORMAT_MODULE_PATH = 'demo_time_set.formats'

[GITHUB] 这是一个完整的工作示例:https://github.com/andilab/demo_time_set

【讨论】:

  • 说我想 存储 UTC 日期但以当地时间显示?我的时区设置为UTC,我的语言环境设置为en,但它没有考虑myapp/formats/en/formats.py 中定义的格式...缺少什么?
  • 仅供参考,这在 django 1.8 上仍然有效
  • 这不符合要求。被问到的是如何在 Django admin 中显示和获取本地时区的时间输入,同时保持内部系统使用 UTC。这并没有实现这个目标。 -1
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-10-21
  • 2017-04-01
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多