繁体   English   中英

如何在Django管理员的change_list中更改模型的顺序

[英]How to change the order of model in change_list in django admin

我真的坚持了一个非常简单的任务(乍看之下很简单)。 我需要在管理员中重新排列更改列表。 我有类别,一些类别是嵌套的,因此它们具有与同一张表相关的“ parent_id”外键。

因此,我唯一需要做的就是以适当的顺序列出所有类别。

代替:

"Category1
subcategory_of_category3
Category2
subcategory_of_category_4
"

我需要:

"Category1
---subcategory_of_category1
Category2
----subcategory_of_category2
"

没别的!

我已经尝试过的

  1. 为我自己的QuerySet提供适当的顺序。 不起作用,因为似乎无法在queryset中执行这种排序和分组
  2. 我试图覆盖change_list.html模板。 但是有一个自定义标签“ list_results”,如果我删除它,我将失去django admin的所有非常好的功能。

我确定我不是第一个需要订购变更单的人。 我认为解决方案必须非常简单。

您可以覆盖链接Django Snippet

Django排序在database level. 除非您将uni_code函数的结果存储在数据库中,否则django将无法本地返回以这种方式排序的结果。

在数据库中存储订购值可能是解决此问题的最便捷方法

我按照Mushahid Khan的建议,通过在数据库中添加订单字段来解决该问题。 由于我需要该站点的实际管理员不必手动指定每个类别的顺序,因此我不得不在模型中重写save()方法。

也许这是非常la脚和丑陋的选择,但对我的项目来说效果很好。 我决定,假定顺序是嵌套的,站点的所有者将要指定每个类别的顺序。 这意味着,例如,我们有“ Category-1”和“ SubCategory-1-1”,“ SubCategory-1-2”等。 如果我们指定“ SubCategory-1-1”的顺序-这将影响父类别中的顺序(即“ Category-1”)。

我决定使用字母顺序,因为在我看来,计算和修改要简单得多。 这是我的save()方法的源代码

    def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
    if self.category_parent_id is not None:
        self._level = '2'
        if len(self.category_parent._order[0:-1])<2:
             self._order = '%s%s%s%s' % ('a', self.category_parent._order[0:-1], self.category_order, self._level)
        else:
            self._order = '%s%s%s' % (self.category_parent._order, self.category_order, self._level)
    else:
        self._level = '1'
        self._order = '%s%s%s%s'%('a', self.category_order, self._level, str(self.id))
        for child in self.children.all():
            child._level = '2'
            if len(self._order[0:-1])<2:
                 child._order = '%s%s%s%s'%('a', self._order[0:-1],  child.category_order, child._level)
            else:
                child._order = '%s%s%s'%(self._order,  child.category_order, child._level)
            super(Category, child).save()
    super(Category, self).save()

我认为,需要对其进行优化,但是目前它仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM