在 Django 管理站点中,如何更改时间字段的显示格式?

问题描述 投票:0回答:5

我最近向我的网站添加了一个新模型,并且我正在使用 admin.py 文件来准确指定我希望它在管理网站中的显示方式。它工作得很好,但我不知道如何让我的日期字段之一在其显示格式中包含秒。我只看到“2011 年 8 月 27 日中午 12:12”之类的值当我想看到的是“2011年8月27日,12:12*:37* p.m.”

python django date-formatting
5个回答
62
投票

在 ModelAdmin 中尝试一下:

def time_seconds(self, obj):
    return obj.timefield.strftime("%d %b %Y %H:%M:%S")
time_seconds.admin_order_field = 'timefield'
time_seconds.short_description = 'Precise Time'    

list_display = ('id', 'time_seconds', )

当然,将“timefield”替换为模型中的适当字段,并在“list_display”中添加任何其他所需的字段。


60
投票

四处挖掘我就结束了,但对我的应用程序应用了不同的方法。

更改 django admin 默认格式可以通过更改您想要的每种类型的 django 语言环境格式来完成。

将以下内容放在您的 admin.py 文件(或 settings.py)中,以更改 django 管理员的日期时间默认格式。

from django.conf.locale.es import formats as es_formats

es_formats.DATETIME_FORMAT = "d M Y H:i:s"

它将更改该文件(或整个站点,如果在设置中)上的 ModelAdmin 日期时间格式。

它不会破坏管理日期时间过滤器和订单功能,正如@Alan Illing 在评论中指出的那样。

希望这对未来有帮助


额外信息:

您可以为 django 中的每个可用语言环境更改它,这有很多。

您可以使用此方法更改以下格式

from django.conf.locale.es import formats as es_formats

es_formats.DATETIME_FORMAT
es_formats.NUMBER_GROUPING
es_formats.DATETIME_INPUT_FORMATS  
es_formats.SHORT_DATETIME_FORMAT
es_formats.DATE_FORMAT             
es_formats.SHORT_DATE_FORMAT
es_formats.DATE_INPUT_FORMATS      
es_formats.THOUSAND_SEPARATOR
es_formats.DECIMAL_SEPARATOR       
es_formats.TIME_FORMAT
es_formats.FIRST_DAY_OF_WEEK       
es_formats.YEAR_MONTH_FORMAT
es_formats.MONTH_DAY_FORMAT

12
投票

如果您尝试过加布里埃尔的答案但不起作用,请尝试在

USE_L10N = False
中设置
settings.py
,它对我有用。

请注意,如果 USE_L10N 设置为 True,则区域设置指定的格式具有更高的优先级,并将被应用

参见:https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-DATETIME_FORMAT


8
投票

接受的答案是正确的,但是我发现理解它的工作方式/原因有点令人困惑。下面是一个小例子,我希望能更清楚地说明如何做到这一点。

Django 提供了几种在管理视图中显示“自定义”字段的方法。我更喜欢实现此行为的方法是在

ModelAdmin
类中定义一个自定义字段并显示该字段,而不是您想要的字段:

from django.contrib import admin
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()

class PersonAdmin(admin.ModelAdmin):
    @admin.display(description='Birthday')
    def admin_birthday(self, obj):
        return obj.birthday.strftime('%Y-%m-%d')

    list_display = ('name', 'admin_birthday')

请注意,我们没有显示

birthday
模型中实际的
Person
字段,而是将自定义字段 (
admin_birthday
) 定义为
PersonAdmin
中的方法,并通过将其添加到
list_display
属性来显示它。此外,
admin.display()
装饰器修改了 Django 在管理视图中显示此自定义字段的方式。使用这种方法,管理面板将显示 NAMEBIRTHDAY 字段,但使用您喜欢的日期格式。

我更喜欢这种方法的原因是您将

Model
字段定义与您在管理面板中显示它们的方式分开。您可以在 Django 管理文档中阅读有关替代方法的更多信息。


0
投票

这对我有用:

在 models.py 中:

class InvoiceValidateLog(models.Model):
    invoice = models.ForeignKey(SpvInvoice, on_delete=models.CASCADE)
    validated_by = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    status = models.BooleanField()
    modified_at = models.DateTimeField(auto_now=True)
    comment = models.TextField(null=True)

在admin.py中

from django.contrib import admin
from django.utils.dateformat import format
from .models import InvoicePayLog

class InvoicePayLogAdmin(admin.ModelAdmin):
    list_display = ('invoice', 'payed_by', 'status', 'formatted_modified_at')
    list_filter = ( 'payed_by__username', 'invoice__no')
    search_fields = ('invoice__no', 'payed_by__username')

    def formatted_modified_at(self, obj):
        """Format the modified_at field to 24-hour format including seconds."""
        return format(obj.modified_at, 'Y-m-d H:i:s')

    formatted_modified_at.short_description = 'Modified At'

admin.site.register(InvoicePayLog, InvoicePayLogAdmin)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.