在 Django Admin 中排序 admin.ModelAdmin 对象
假设我的披萨应用程序包含 Topping 和 Pizza 类,它们在 Django Admin 中显示如下:
PizzaApp
-
Toppings >>>>>>>>>> Add / Change
Pizzas >>>>>>>>>> Add / Change
但我希望它们像这样:
PizzaApp
-
Pizzas >>>>>>>>>> Add / Change
Toppings >>>>>>>>>> Add / Change
如何在我的 admin.py
中配置它?
Let's say I have my pizza application with Topping and Pizza classes and they show in Django Admin like this:
PizzaApp
-
Toppings >>>>>>>>>> Add / Change
Pizzas >>>>>>>>>> Add / Change
But I want them like this:
PizzaApp
-
Pizzas >>>>>>>>>> Add / Change
Toppings >>>>>>>>>> Add / Change
How do I configure that in my admin.py
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(23)
您可以尝试的解决方法是调整您的 models.py,如下所示:
不确定它是否违反 django 的最佳实践,但它有效(使用 django trunk 进行测试)。
祝你好运!
PS:抱歉,如果这个答案发布得太晚了,但它可以帮助其他人在未来类似的情况下。
A workaround that you can try is tweaking your models.py as follows:
Not sure if it is against the django's best practices but it works (tested with django trunk).
Good luck!
PS: sorry if this answer was posted too late but it can help others in future similar situations.
如果你想在 10 秒内解决这个问题,只需在 verbose_name_plural 中使用空格,例如:
当然,它并不优雅,但在我们得到更好的解决方案之前可能会工作一段时间。
If you want to solve this in 10 seconds just use spaces in verbose_name_plural, for example:
Of course it isn't ellegant but may work for a while before we get a better solution.
多亏了这个 Django 片段,我最终成功做到了这一点,您只需要注意
ADMIN_REORDER< /code> 设置:
app1
不得以项目名称为前缀,即使用app1
而不是mysite.app1
。I eventually managed to do it thanks to this Django snippet, you just need to be aware of the
ADMIN_REORDER
setting:app1
must not be prefixed with the project name, i.e. useapp1
instead ofmysite.app1
.现在有一个很好的 Django 包:
https://pypi.python.org/pypi/django-modeladmin-reorder
There's now a nice Django package for that:
https://pypi.python.org/pypi/django-modeladmin-reorder
2018年6月回答
这个答案和Vasil的想法类似,
我试图解决类似的问题,然后我看到了这样的片段。
我根据这个剪辑做了一些修改。 代码如下。
请注意,此排序功能中使用的排序列表包含系统中所有应用程序及其模块的排序。 如果不需要,请根据自己的需求设计排序功能。
在Django 2.0上效果很好
Answer in June 2018
This answer is similar to Vasil's idea
I tried to solve similar problems, and then I saw such the fragment.
I made some modifications based on this clip. The code is as follows.
Note that the sorting list used in this sorting function contains the sorting of all app and its modules in the system. If you don't need it, please design the sorting function according to your own needs.
It works great on Django 2.0
这实际上在 编写你的第一个 Django 应用程序,第 7 部分。
这是相关部分:
This is actually covered at the very bottom of Writing your first Django app, part 7.
Here's the relevant section:
这是 Emmanuel 使用的代码片段,针对 Django 1.8 进行了更新:
在 templatetags/admin_reorder.py 中:
在 settings.py 中:(
在此处插入您自己的应用程序名称。管理员会将缺少的应用程序或模型放在列表的末尾,只要您在每个应用程序中至少列出两个模型。)
在您的 base_site.html 副本中:
Here's the snippet Emmanuel used, updated for Django 1.8:
In templatetags/admin_reorder.py:
In settings.py:
(insert your own app names in here. Admin will place missing apps or models at the end of the list, so long as you list at least two models in each app.)
In your copy of base_site.html:
如果您在 AdminSite 中使用 Suit,您可以使用 菜单标签。
If you're using Suit for the AdminSite you can do menu customization using the menu tag.
您可以在管理页面中重新排序和隐藏应用程序和模型。 *我使用Django 4.1.7。
例如,
app1/models.py
和app2/models.py
中有相同的 3 个模型,如下所示:那么,
中有相同的 3 个管理员>app1/admin.py
和app2/admin.py
如下所示:然后,
AUTHENTICATION AND AUTHORIZATION(auth)
等 3 个应用程序会显示在中>Home
管理页面如下所示:现在,设置
ADMIN_ORDERING
并在中重写的
如下所示。 *可以查看原文 get_app_list()< /a> in GitHub:get_app_list()
中处理它settings.py然后,在
Home
管理页面中更改 3 个应用程序和模型的顺序,如下所示。 *它们的顺序在其他管理页面中也发生了变化,而不仅仅是在Home
管理页面中:接下来,删除
app2 中的
、Model1
auth
本身以及app1
中的所有模型来隐藏它们,如下所示:然后,
app2
中的Model1
code>、auth
本身以及app1
中的所有模型都隐藏在Home
管理页面中,如下所示。 *它们还隐藏在其他管理页面中,而不仅仅是在Home
管理页面中:< img src="https://i.sstatic.net/jdxkT.png" alt="在此处输入图像描述">
此外,即使不存在的应用程序和模型设置为
ADMIN_ORDERING
如下所示:然后,它们将被忽略并且不显示,如下所示。 实际上,如果不存在的应用程序和模型设置为
ADMIN_ORDERING
,我想返回错误,但我没有太多时间考虑它:You can reorder and hide the apps and models in admin pages. *I use Django 4.1.7.
For example, there are the same 3 models in
app1/models.py
andapp2/models.py
as shown below:Then, there are the same 3 admins in
app1/admin.py
andapp2/admin.py
as shown below:Then, 3 apps including
AUTHENTICATION AND AUTHORIZATION(auth)
are displayed inHome
admin page as shown below:Now, set
ADMIN_ORDERING
and treat it in overriddenget_app_list()
insettings.py
as shown below. *You can see the original get_app_list() in GitHub:Then, the order of 3 apps and the models is changed in
Home
admin page as shown below. *The order of them is also changed in other admin pages not just inHome
admin page:Next, remove
Model1
inapp2
,auth
itself and all models inapp1
to hide them as shown below:Then,
Model1
inapp2
,auth
itself and all models inapp1
are hidden inHome
admin page as shown below. *They are also hidden in other admin pages not just inHome
admin page:In addition, even if the apps and models which don't exist are set to
ADMIN_ORDERING
as shown below:Then, they are ignored and not displayed as shown below. Actually, I wanted to return error if the apps and models which don't exist are set to
ADMIN_ORDERING
but I don't have much time to think about it:这个解决方案对我有用,修改了林伟雄的解决方案。
您可以保留默认的身份验证顺序并指定您自己的。
This solution works for me, modified the one from 林伟雄.
You get to keep the default auth ordering AND specify your own.
我正在寻找一个简单的解决方案,我可以在管理面板中按应用程序的名称对应用程序进行排序。 我想出了以下模板标记:
然后,只需覆盖
templates/admin/index.html
并添加该模板标记:在 settings.py 中自定义
APP_ORDER
:然后 在 Django 1.10 上运行良好
I was looking for a simple solution where I could order the apps by their name in the admin panel. I came up with the following template tag:
Then, just override
templates/admin/index.html
and add that template tag:Then customized the
APP_ORDER
in settings.py:It works great on Django 1.10
这是一个为您提供更多灵活性的版本,即:
apps.py
并检查apps.py
的 name 属性。 code>class Config(AppConfi): 或者如果不存在,请使用项目中应用程序的目录名称。将此代码添加到您的
settings.py
文件中:这只不过是覆盖 Django 在文件 python2.7/site-packages/django/contrib/admin/sites.py 上定义的函数。
class AdminSite(object):
的get_app_list
方法生成包含项目上所有应用程序的数据结构,包括 Django 的 auth 应用程序,例如:Here's a version that gives you a bit more flexibility, namely:
apps.py
inside the app's directory and check for name property of theclass Config(AppConfi):
or in case that is not present, use the name of the directory for the app in the project.Add this code somewhere in your
settings.py
file:This is nothing more than overwriting the function defined by Django on the file python2.7/site-packages/django/contrib/admin/sites.py.
That
get_app_list
method ofclass AdminSite(object):
produces a data structure with all apps on the project, including for Django's auth app, such as:这只是在黑暗中进行的疯狂尝试,但是您调用 admin.site.register(,) 的顺序是否有可能确定显示顺序? 实际上,我怀疑这是否有效,因为我相信 Django 维护着模型的注册表 -> ModelAdmin 对象作为标准 Python 字典实现,不维护迭代顺序。
如果这不符合您想要的方式,您可以随时使用 django/contrib/admin 中的源代码。 如果需要维护迭代顺序,可以将 AdminSite 类(在 admin/sites.py 中)中的 _registry 对象替换为维护键插入顺序的 UserDict 或 DictMixin。 (但是请对这个建议持保留态度,因为我自己从未进行过此类更改,我只是对 Django 如何迭代 ModelAdmin 对象集合进行有根据的猜测。我确实认为 django/contrib不过, /admin/sites.py 是查找此代码的地方,而 AdminSite 类以及 register() 和 index() 方法尤其是您想要的。)
显然,这里最好的事情对您来说是一个简单的选择在您自己的 /admin.py 模块中指定。 我确信这就是您希望收到的答案。 不过,我不确定这些选项是否存在。
This is just a wild stab in the dark, but is there any chance that the order in which you call admin.site.register(< Model class >, < ModelAdmin class >) can determine the display order? Actually, I doubt that would work because I believe Django maintains a registry of the Model -> ModelAdmin objects implemented as a standard Python dictionary, which does not maintain iteration ordering.
If that doesn't behave the way you want, you can always play around with the source in django/contrib/admin. If you need the iteration order maintained, you could replace the _registry object in the AdminSite class (in admin/sites.py) with a UserDict or DictMixin that maintains insertion order for the keys. (But please take this advice with a grain of salt, since I've never made these kinds of changes myself and I'm only making an educated guess at how Django iterates over the collection of ModelAdmin objects. I do think that django/contrib/admin/sites.py is the place to look for this code, though, and the AdminSite class and register() and index() methods in particular are what you want.)
Obviously the nicest thing here would be a simple option for you to specify in your own /admin.py module. I'm sure that's the kind of answer you were hoping to receive. I'm not sure if those options exist, though.
我的解决方案是创建 django.contrib.admin.sites.AdminSite 和 django.contrib.admin.options.ModelAdmin 的子类。
我这样做是为了可以为每个应用程序显示更具描述性的标题,并排序每个应用程序中模型的外观。 因此,我的 settings.py 中有一个字典,它将 app_labels 映射到描述性名称以及它们应出现的顺序,模型按我在管理站点注册时在每个 ModelAdmin 中提供的序数字段进行排序。
尽管文档中鼓励创建您自己的 AdminSite 和 ModelAdmin 子类,但我的解决方案最终看起来像是一个丑陋的黑客。
My solution was to make subclasses of django.contrib.admin.sites.AdminSite and django.contrib.admin.options.ModelAdmin .
I did this so I could display a more descriptive title for each app and order the appearance of models in each app. So I have a dict in my settings.py that maps app_labels to descriptive names and the order in which they should appear, the models are ordered by an ordinal field I provide in each ModelAdmin when I register them with the admin site.
Although making your own subclasses of AdminSite and ModelAdmin is encouraged in the docs, my solution looks like an ugly hack in the end.
将 lib\site-packages\django\contrib\admin\templates\admin\index.html 模板复制到
project1\templates\admin\
目录,其中project1< /code> 是您的项目名称。
在复制的文件(即
project1\templates\admin\index.html
)中,将行:替换为:
其中:
app1
是带有模型的应用程序的名称,modeli
是app1
中第 i 个模型的名称。如果您在项目中使用模型定义了多个应用程序,则只需在上述
index.html
文件中添加另一个表即可。因为我们改变了模板,所以我们可以随意改变它的HTML代码。 例如,我们可以添加模型的描述,如上所示。 您还可以恢复添加和更改链接 - 我删除了它们,因为我认为它们是多余的。
答案是Dave Kasper 的答案中解决方案的实际演示。
Copy
lib\site-packages\django\contrib\admin\templates\admin\index.html
template toproject1\templates\admin\
directory, whereproject1
is the name of your project.In the copied file, i.e.
project1\templates\admin\index.html
, replace lines:with:
where:
app1
is the name of your application with models,modeli
is the name of i-th model inapp1
.If you defined more than one application with models in your project, then simply add another table in the above
index.html
file.Because we change the template, we can freely change its HTML code. For example we can add a description of the models as it was shown above. You can also restore Add and Change links - I deleted them since I think they are redundant.
The answer is a practical demonstration of the solution from Dave Kasper's answer.
custom_admin.py
admin_site = CustomAdminSite()
urls.py
custom_admin.py
admin_site = CustomAdminSite()
urls.py
将以下代码添加到您的settings.py:
并对排序字典进行更改以匹配您的应用程序和模型。 就是这样。
我的解决方案的好处是,如果用户是超级用户,它将显示“auth”模型。
Add the below code to your settings.py:
And make changes to the ordering dictionary to match your apps and models. That's it.
The benefit of my solution is that it will show the 'auth' models if the user is a superuser.
默认情况下,Django 按字母顺序对 admin 中的模型进行排序。 因此,事件管理中模型的顺序是 Epic、EventHero、EventVillain、Event
相反,您希望的顺序是
用于呈现管理索引页面的模板是
admin/index.html
,视图函数是ModelAdmin.index
。方法
get_app_list
,设置模型的顺序。:因此,为了设置顺序,我们将
get_app_list
重写为:代码
app['models'].sort( key=lambda x: ordering[x['name']])
设置固定顺序。 您的应用程序现在看起来像这样。查看文档< /a>
Django, by default, orders the models in admin alphabetically. So the order of models in Event admin is Epic, EventHero, EventVillain, Event
Instead you want the order to be
The template used to render the admin index page is
admin/index.html
and the view function isModelAdmin.index
.The method
get_app_list
, set the order of the models.:So to set the order we override
get_app_list
as:The code
app['models'].sort(key=lambda x: ordering[x['name']])
sets the fixed ordering. Your app now looks like this.Check the Documentation
在
Settings.py
文件中设置管理中列出的应用程序/模块的显示顺序设置我的排序列表
在 ADMIN_ORDERING 下面创建排序函数
In
Settings.py
file setting the order in which the apps/modules show up listed on Adminset my ordering list
Creating a sort function below ADMIN_ORDERING
一种相当简单且自包含的方法可以使用装饰器模式以这种方式重新排列您的应用程序和模块:
此代码仅在顶部对排序字典中定义的键进行排序,而将所有其他键留在底部。
该方法很干净,但它需要在之前执行 get_app_list...当性能很重要并且您有一个很大的 app_list 时,这可能不是一个好主意。
Quite a simple and self contained approach can be using the decorator pattern to resort your app and modules in this way:
This code sorts at the top only the defined keys in the ordering dict, leaving at the bottom all the other.
The approach is clean but it requires get_app_list to be executed before... which is probably not a good idea when performance is important and you have a large app_list.
至少,在 Django 管理面板中有 3 种方法可以进行模型排序:
不错的方法,但您会在管理面板中看到数字
它简单快速,但是不是 django-clean 并且这个库非常旧并且被废弃了
django-clean 方法,但需要更多的时间来配置
At least, there are 3 ways to do model ordering in Django admin panel:
not bad way, but you will see numbers in admin panel
it is simple and fast, but not django-clean as well as this library is very old and abandoned
django-clean method, but more time expenses to configure
get_app_list
函数get_app_list
function in utils.py这在 Django 4.1 中变得容易多了 :
您可以子类化并重写 此方法 更改返回的应用程序/模型列表的顺序。
This has become a lot easier in Django 4.1:
You can subclass and override this method to change the order the returned list of apps/models.