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

3

我正在使用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

2个回答

1
在Django中很容易实现。您只需要进入admin.py创建一个与您的模型名称相对应的类,然后添加根据创建日期进行排序的过滤器即可自动排列所有日期。 示例: 步骤1:转到您的应用程序的admin.py 步骤2:添加以下代码
class YourModelAdmin(admin.ModelAdmin):
list_filter=['data_de_montat']

这不完全是我想要的,不是关于过滤,而是关于它们的显示顺序。 - learner123

0

我通过使用annotate和数据库函数的组合添加了3个计算字段来解决这个问题。虽然不是我梦寐以求的解决方案,但我已经妥善处理了它。这段代码出现在管理模型中。

    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),
                                   output_field=IntegerField()),
                         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及其任何组合的日期。

欢迎回复更好的解决方案或改进此方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接