Django管理员自定义降序和升序字段

问题描述

我正在使用Django Admin可视化和编辑我的模型数据。该模型的字段之一是日期,但不幸的是一个CharField但带有一个验证器(dd.mm.yyyy)。我试图找到一种解决方案,当管理员按Django默认的排序按钮时,以正确的方式对这些日期进行排序。以我在Java方面的经验来说,所有这些都是关于重写类的compare函数的。

data_de_montat = models.CharField(help_text="eg: 02.07.2020 or 12.9.2021",max_length=15,validators=[
    RegexValidator(r'^[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$',message='It should be dd.ll.aaaa',code='wrong format'
                   )])

the button

解决方法

在django中,这非常容易。您只需要进入admin.py用您的模型名称创建一个类,然后在创建日期添加过滤器即可自动为您整理所有日期。 示例:

步骤1: 转到您应用的admin.py

第2步:添加以下代码

class YourModelAdmin(admin.ModelAdmin):
list_filter=['data_de_montat']
,

我设法通过使用Database functions的注释和组合添加3个计算字段来格式化数据,从而解决了该问题。这不是我梦dream以求的解决方案,但我以某种方式进行了处理。 该代码位于管理模型中。

    def get_queryset(self,request):
        qs = super(ProgramareAdmin,self).get_queryset(request)
        qs = qs.annotate(day=Cast(str("data_de_montat").split(".")[0],output_field=IntegerField()),month=Cast(Substr("data_de_montat",StrIndex("data_de_montat",V('.')) + 1),year=Cast(Right("data_de_montat",4),output_field=IntegerField()))
        return qs

    def day(self,obj):
        return obj.day

    def month(self,obj):
        return obj.month

    def year(self,obj):
        return obj.year

    day.admin_order_field = 'day'  # sortable new column
    month.admin_order_field = 'month'  # sortable new column
    year.admin_order_field = 'year'  # sortable new column

这仅适用于使用dd.mm.yyyy或d.m.yyyy等格式的日期及其任何组合。

请使用此方法的更好解决方案或改进方法进行回复。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...