我想在我的Django管理界面中订购模型。 默认值是应用内模型的字母顺序。
我想避免创建额外的包等等,或者不得不改变Django本身。
可以通过覆盖Django管理模板或其他轻量级方式来完成吗?
编辑:
我不想订购最终产品,比如待办事项列表。
我想在admin的索引页面中订购不同的模型。例如。 todos 出现在汽车之前。
答案 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中添加过滤器和排序窗格。它看起来像这样。
这些更改必须在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