在Django管理员中订购模型 - 轻/右的方式

时间:2012-12-23 05:37:34

标签: django django-models django-admin

我想在我的Django管理界面中订购模型。 默认值是应用内模型的字母顺序。

我想避免创建额外的包等等,或者不得不改变Django本身。

可以通过覆盖Django管理模板或其他轻量级方式来完成吗?

编辑:

我不想订购最终产品,比如待办事项列表。

我想在admin的索引页面中订购不同的模型。例如。 todos 出现在汽车之前。

5 个答案:

答案 0 :(得分:4)

您可以覆盖模板并添加模板标签进行排序。这是一个片段,可能需要进行一些更改http://djangosnippets.org/snippets/1939/

答案 1 :(得分:3)

我认为没有一种轻量级的方法 - 一方面没有设施存储顺序,所以它至少会涉及一个新的数据库字段,然后代码获取该字段以找到所需的排序。实际上,这可能不起作用,因为AdminSite是动态构建的,而不是存储在数据库中...嗯,让我们看看Django做了什么......

索引模板只是管理员注册的应用程序的循环,并且在每个应用程序中都是模型循环。这些的排序由https://github.com/django/django/blob/master/django/contrib/admin/sites.py中的第384行定义 - 因此一个钩子将是AdminSite的子类并重写索引方法。这里讨论了新的AdminSite事项:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#adminsite-objects

也许如果您想按照注册顺序展示模型,您可以在该方法中取出分类线。

答案 2 :(得分:3)

我要留下一个不太好的答案。

模型在django / contrib / admin / sites.py

的第448行排序
448        # Sort the models alphabetically within each app.
449        for app in app_list:
450            app['models'].sort(key=lambda x: x['name'])

我没有对此进行测试,但你可以尝试在模型的Meta类中添加一个变量,用于在第403行的for循环中设置管理员索引页面中模型的顺序。

403        for model, model_admin in self._registry.items():
               ,,,
431                    else:
432                        order = model._meta.order
433                        app_dict[app_label] = {
434                            'order': order,
435                            ...

并使用以下内容替换排序:

450            app['models'].sort(key=lambda x: x['order'])

答案 3 :(得分:2)

我刚用代理模型做到了这一点,因此可以将模型分组到一个标题下。我意识到您只需更改代理模型的verbose_name和verbose_name_plural即可调整排序顺序。因此,使用“”+ ._meta.verbose_name可以实现顶级名称,而其他名称可以通过1.,2. 3.,...重新排序...

我确信这不是你想要的,但这个重量轻,我可以达到可接受的效果。

# foo/admin.py
from django.contrib import admin
from zoo.models import Zoo

class ZooProxy(Zoo):
    class Meta:
        proxy = True
        app_label = 'foo'
        verbose_name = " " + Zoo._meta.verbose_name
        verbose_name_plural = " " + Zoo._meta.verbose_name_plural


# one/admin.py
from django.contrib import admin
from one.models import One

class OneProxy(One):
    class Meta:
        proxy = True
        app_label = 'foo'
        verbose_name = "2. " + One._meta.verbose_name
        verbose_name_plural = "2. " + One._meta.verbose_name_plural


# two/admin.py
from django.contrib import admin
from two.models import Two

class TwoProxy(Two):
    class Meta:
        proxy = True
        app_label = 'foo'
        verbose_name = "1. " + Two._meta.verbose_name
        verbose_name_plural = "1. " + Two._meta.verbose_name_plural

导致django admin:

Foo:
    Zoo
    1. Two
    2. One

-vs-

Foo:
    One
    Two
    Zoo

答案 4 :(得分:-3)

我不确定Django是否提供默认排序,但您可以使用ModelAdmin对象在Django admin中添加过滤器和排序窗格。它看起来像这样。enter image description here

这些更改必须在admin.py文件中完成

class PersonAdmin(ModelAdmin):
    list_filter = ('is_staff', 'company')

list_filter将添加可以满足您排序和过滤目的的窗格

有关详情,请查看以下内容:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter