【问题标题】:Django admin custom descending and ascending fieldDjango admin 自定义降序和升序字段
【发布时间】:2020-12-28 17:02:17
【问题描述】:

我正在使用 Django Admin 来可视化和编辑我的模型的数据。模型的字段之一是日期,不幸的是,它是一个 CharField,但带有一个验证器 (dd.mm.yyyy)。当管理员按下 django 默认的排序按钮时,我试图找出一种解决方案,以正确的方式对这些日期进行排序。根据我使用 Java 的经验,这完全是为了覆盖类的比较函数。

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'
                   )])

【问题讨论】:

    标签: python django django-models django-admin django-admin-filters


    【解决方案1】:

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

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

    第 2 步:添加以下代码

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

    【讨论】:

    • 这不是我想要的,这不是关于装配,而是关于他们的显示顺序。
    【解决方案2】:

    我设法通过使用 Database functions 的注释和组合添加 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 等格式的日期以及它们的任意组合。

    请随时回复对此方法的更好解决方案或改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      相关资源
      最近更新 更多