问题描述
我正在使用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'
)])
解决方法
在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等格式的日期及其任何组合。
请使用此方法的更好解决方案或改进方法进行回复。