我最近向我的网站添加了一个新模型,并且我正在使用 admin.py 文件来准确指定我希望它在管理网站中的显示方式。它工作得很好,但我不知道如何让我的日期字段之一在其显示格式中包含秒。我只看到“2011 年 8 月 27 日中午 12:12”之类的值当我想看到的是“2011年8月27日,12:12*:37* p.m.”
在 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”中添加任何其他所需的字段。
四处挖掘我就结束了,但对我的应用程序应用了不同的方法。
更改 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
如果您尝试过加布里埃尔的答案但不起作用,请尝试在
USE_L10N = False
中设置settings.py
,它对我有用。
请注意,如果 USE_L10N 设置为 True,则区域设置指定的格式具有更高的优先级,并将被应用
参见:https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-DATETIME_FORMAT
接受的答案是正确的,但是我发现理解它的工作方式/原因有点令人困惑。下面是一个小例子,我希望能更清楚地说明如何做到这一点。
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 在管理视图中显示此自定义字段的方式。使用这种方法,管理面板将显示 NAME 和 BIRTHDAY 字段,但使用您喜欢的日期格式。
我更喜欢这种方法的原因是您将
Model
字段定义与您在管理面板中显示它们的方式分开。您可以在 Django 管理文档中阅读有关替代方法的更多信息。
这对我有用:
在 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)