【问题标题】:Modify the DateField format shown on ModelAdmin list_display修改 ModelAdmin list_display 上显示的 DateField 格式
【发布时间】:2020-10-18 00:14:56
【问题描述】:

在我的 ModelAdmin 上,我可以使用我想要的格式(即 #format='%Y-%m-%d')查看 task_date DateField。但是,当使用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 的格式

【问题讨论】:

    标签: django datetime django-models format django-admin


    【解决方案1】:

    StaffTimeSheetModelAdmin 类中的 admin.py 中编写一个函数

        def custom_date_format(self, obj):
          if obj.task_date:
            return "your formatting logic here"
          return ''
    

    list_display 中添加custom_date_format

    【讨论】:

    • 非常感谢!这给了我一个很好的线索,即使它不是完整的解决方案
    【解决方案2】:

    为了解决这个问题,我必须做两件事。

    1. 按照@Clifton Avil D'Souza 的建议在 StaffTimeSheetModelAdmin 类中编写一个函数
    2. 将时间转换为我想要的格式

    为了执行第 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')
        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-03
      • 2015-03-12
      • 2020-06-11
      • 2010-09-14
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多