修改 ModelAdmin 上显示的 DateField 格式 list_display
Modify the DateField format shown on ModelAdmin list_display
在我的 ModelAdmin 上,我能够看到 task_date DateField 使用我想要的格式(即 # format='%Y-%m-%d')。但是,当使用 list_display('task_date')
时,相同的 DateField 会以另一种格式显示。如何指定 list_display 需要用于 DateFields 的格式?
在 models.py
class StaffTimeSheet(models.Model):
time_sheet_owner = models.ForeignKey("Staff", on_delete=models.CASCADE)
task_date = models.DateField(verbose_name='Date') # format='%Y-%m-%d'
task_belongs_to_order = models.ManyToManyField("Order", related_name = 'order_present_in_timesheet_of')
task_start_time = models.TimeField()
task_end_time = models.TimeField()
service_category = models.ManyToManyField("ServiceCategory", related_name = 'service_category_present_in_timesheet_of')
task_description = models.TextField()
def __str__(self):
return str(self.time_sheet_owner) + " / " + str(self.task_date) + " / " + str(self.task_start_time)
在 admin.py
class StaffTimeSheetModelAdmin(admin.ModelAdmin):
#determines size of input text box
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size':'50'})},
models.TextField: {'widget': Textarea(attrs={'rows':2, 'cols':50})},
}
fields = ['time_sheet_owner','task_date','task_belongs_to_order','task_start_time','task_end_time','service_category','task_description']
def task_belongs_to_project_order (self,staff_time_sheet_obj):
return "\n".join([str(order.order_project.project_number) + "-" + str(order.order_number) for order in staff_time_sheet_obj.task_belongs_to_order.all()])
# TODO enforce a date format year-month-day
list_display = ('time_sheet_owner','task_date','task_belongs_to_project_order','task_start_time','task_end_time','task_description')
search_fields = ['task_date','task_description','task_belongs_to_order__order_number','task_belongs_to_order__order_project__project_number'] # TODO add task_belongs_to_project_order
list_filter = ('time_sheet_owner','task_date',)
admin.site.register(StaffTimeSheet, StaffTimeSheetModelAdmin)
这是创建新的 StaffTimeSheet 对象时 DateField 的样子
这是创建的 StaffTimeSheet 对象的列表,我想在其中修改 task_date DateField
的格式
在那个admin.py里面写一个函数classStaffTimeSheetModelAdmin
def custom_date_format(self, obj):
if obj.task_date:
return "your formatting logic here"
return ''
在list_display
中添加custom_date_format
为了解决这个问题,我不得不做两件事。
- 按照@Clifton Avil D'Souza 的建议在 class StaffTimeSheetModelAdmin 中编写一个函数
- 将时间转换成我想要的格式
为了执行第 2 步,我创建了一个名为 day_hour_format_converter 的辅助函数,我必须在其中执行 UTC 到本地时间的转换,因为默认情况下存储在数据库中的时间是 UTC 并且我正在显示错误的小时值
models.py 未修改。这是我更新的代码:
在 admin.py
from django.utils.timezone import now, localtime
def day_hour_format_converter(date_time_UTC):
local_time = localtime(date_time_UTC)
return str(local_time.year) +'-'+ str(local_time.month) +'-'+ str(local_time.day) + ' , ' + str(local_time.hour) +':'+ str(local_time.minute)
class StaffTimeSheetModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size':'50'})},
models.TextField: {'widget': Textarea(attrs={'rows':2, 'cols':50})},
}
def task_belongs_to_project_order (self,staff_time_sheet_obj):
return "\n".join([str(order.order_project.project_number) + "-" + str(order.order_number) for order in staff_time_sheet_obj.task_belongs_to_order.all()])
def start_time(self, staff_time_sheet_obj):
if staff_time_sheet_obj.task_start_time:
return day_hour_format_converter(staff_time_sheet_obj.task_start_time)
def end_time(self, staff_time_sheet_obj):
if staff_time_sheet_obj.task_end_time:
return day_hour_format_converter(staff_time_sheet_obj.task_end_time)
list_display = ('time_sheet_owner','task_belongs_to_project_order','start_time','end_time','task_description')
search_fields = ['task_start_time','task_description','task_belongs_to_order__order_number','task_belongs_to_order__order_project__project_number'] #TODO be able to look for "project-order" as a monolitic expression
list_filter = ('time_sheet_owner','task_start_time')
在我的 ModelAdmin 上,我能够看到 task_date DateField 使用我想要的格式(即 # format='%Y-%m-%d')。但是,当使用 list_display('task_date')
时,相同的 DateField 会以另一种格式显示。如何指定 list_display 需要用于 DateFields 的格式?
在 models.py
class StaffTimeSheet(models.Model):
time_sheet_owner = models.ForeignKey("Staff", on_delete=models.CASCADE)
task_date = models.DateField(verbose_name='Date') # format='%Y-%m-%d'
task_belongs_to_order = models.ManyToManyField("Order", related_name = 'order_present_in_timesheet_of')
task_start_time = models.TimeField()
task_end_time = models.TimeField()
service_category = models.ManyToManyField("ServiceCategory", related_name = 'service_category_present_in_timesheet_of')
task_description = models.TextField()
def __str__(self):
return str(self.time_sheet_owner) + " / " + str(self.task_date) + " / " + str(self.task_start_time)
在 admin.py
class StaffTimeSheetModelAdmin(admin.ModelAdmin):
#determines size of input text box
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size':'50'})},
models.TextField: {'widget': Textarea(attrs={'rows':2, 'cols':50})},
}
fields = ['time_sheet_owner','task_date','task_belongs_to_order','task_start_time','task_end_time','service_category','task_description']
def task_belongs_to_project_order (self,staff_time_sheet_obj):
return "\n".join([str(order.order_project.project_number) + "-" + str(order.order_number) for order in staff_time_sheet_obj.task_belongs_to_order.all()])
# TODO enforce a date format year-month-day
list_display = ('time_sheet_owner','task_date','task_belongs_to_project_order','task_start_time','task_end_time','task_description')
search_fields = ['task_date','task_description','task_belongs_to_order__order_number','task_belongs_to_order__order_project__project_number'] # TODO add task_belongs_to_project_order
list_filter = ('time_sheet_owner','task_date',)
admin.site.register(StaffTimeSheet, StaffTimeSheetModelAdmin)
这是创建新的 StaffTimeSheet 对象时 DateField 的样子
这是创建的 StaffTimeSheet 对象的列表,我想在其中修改 task_date DateField
的格式在那个admin.py里面写一个函数classStaffTimeSheetModelAdmin
def custom_date_format(self, obj):
if obj.task_date:
return "your formatting logic here"
return ''
在list_display
中添加custom_date_format
为了解决这个问题,我不得不做两件事。
- 按照@Clifton Avil D'Souza 的建议在 class StaffTimeSheetModelAdmin 中编写一个函数
- 将时间转换成我想要的格式
为了执行第 2 步,我创建了一个名为 day_hour_format_converter 的辅助函数,我必须在其中执行 UTC 到本地时间的转换,因为默认情况下存储在数据库中的时间是 UTC 并且我正在显示错误的小时值
models.py 未修改。这是我更新的代码:
在 admin.py
from django.utils.timezone import now, localtime
def day_hour_format_converter(date_time_UTC):
local_time = localtime(date_time_UTC)
return str(local_time.year) +'-'+ str(local_time.month) +'-'+ str(local_time.day) + ' , ' + str(local_time.hour) +':'+ str(local_time.minute)
class StaffTimeSheetModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size':'50'})},
models.TextField: {'widget': Textarea(attrs={'rows':2, 'cols':50})},
}
def task_belongs_to_project_order (self,staff_time_sheet_obj):
return "\n".join([str(order.order_project.project_number) + "-" + str(order.order_number) for order in staff_time_sheet_obj.task_belongs_to_order.all()])
def start_time(self, staff_time_sheet_obj):
if staff_time_sheet_obj.task_start_time:
return day_hour_format_converter(staff_time_sheet_obj.task_start_time)
def end_time(self, staff_time_sheet_obj):
if staff_time_sheet_obj.task_end_time:
return day_hour_format_converter(staff_time_sheet_obj.task_end_time)
list_display = ('time_sheet_owner','task_belongs_to_project_order','start_time','end_time','task_description')
search_fields = ['task_start_time','task_description','task_belongs_to_order__order_number','task_belongs_to_order__order_project__project_number'] #TODO be able to look for "project-order" as a monolitic expression
list_filter = ('time_sheet_owner','task_start_time')