首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >django xadmin :如何根据model里自定义的方法在list_display里面排序?

django xadmin :如何根据model里自定义的方法在list_display里面排序?

提问于 2020-07-24 15:21:54
回答 0关注 0查看 554

我在model里面自定义了一个报警时间的方法,是通过(当前日期-校正日期+有效期)这样计算出来的,同时也显示在list_display中,现在的问题是在list列表中无法通过点击列名来排序,其他的数据库里有的字段都是可以通过点击列名来选择排序方式,就是这个自定义的方法不行,有哪位高手知道如何解决?我查了一下有个admin_order_field方法可以让自定义的方法排序,但是这个方法只能设置model里面有的字段,无法选择自定义的方法。

# adminx.py(其中alarmData是model里面自定义的方法)

代码语言:javascript
复制
class ToolsAdmin(object):
    ordering = ('id',)
    list_per_page = 20
    # 调整文本输入框的大小
    formfield_overrides = {
        models.IntegerField: {'widget': TextInput(attrs={'size': '20'})}
    }
    # 设置工具清单表格显示内容
    list_display = (
        'num', 'name', 'model', 'type', 'measuring_range', 'classes', 'calibration_data', 'certificate_num',
        'expiry_data',
        'nextDate', 'status', 'status_record', 'use_department',
        'location', 'buy_data', 'comment', 'alarmData', 'file', 'photo')
    # 设置过滤器
    list_filter = ('classes', 'status', 'use_department', 'type')
    # 设置查询字段
    search_fields = ('num', 'name')
    list_editable = ('calibration_data', 'certificate_num', 'expiry_data', 'file')

# model.py

代码语言:javascript
复制
class Tools(models.Model):
    ...
    calibration_data = models.DateField(verbose_name='校正日期', null=True, blank=True)
    expiry_data = models.IntegerField(choices=EXPIRY_DATA_ITEMS, default=0, verbose_name='有效期(月)', null=True,
                                      blank=True)
    def alarmData(self):
        color_code = 'black'
        # 如果计量日期不为空,而且状态是在用,计算还需要多少天计量
        if self.calibration_data is not None and self.status == 0:
            # 根据计量有效期来计算还需要多少天计量
            if self.expiry_data == 0:
                date = self.calibration_data + relativedelta(months=12) - datetime.date.today()
            elif self.expiry_data == 1:
                date = self.calibration_data + relativedelta(month=6) - datetime.date.today()
            else:
                date = ''
            # 判断报警时间是否是小于0的,如果小于零则为红色
            if date.days < 0:
                color_code = 'red'
            return format_html(
                '<span style = "color: {};">{}</span>',
                color_code,
                date.days
            )
        else:
            return ''

下面是xadmin后台列表显示的内容

我想通过点击“报警时间”来排序
我想通过点击“报警时间”来排序

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档