如何为同一模型创建多个ModelAdmin,每个模型都有不同的自定义并链接到不同的URL?
假设我有一个名为Posts的Django模型 . 默认情况下,此模型的管理视图将列出所有Post对象 .
我知道我可以通过设置list_display等变量或覆盖模型管理中的 queryset
方法,以各种方式自定义页面上显示的对象列表,如下所示:
class MyPostAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date')
def queryset(self, request):
request_user = request.user
return Post.objects.filter(author=request_user)
admin.site.register(MyPostAdmin, Post)
默认情况下,可以通过URL /admin/myapp/post
访问它 . 但是我想拥有相同模型的多个视图/ ModelAdmins . 例如 /admin/myapp/post
将列出所有帖子对象, /admin/myapp/myposts
将列出属于该用户的所有帖子, /admin/myapp/draftpost
可能列出所有尚未发布的帖子 . (这些只是示例,我的实际用例更复杂)
您不能为同一模型注册多个ModelAdmin(这会导致 AlreadyRegistered
异常) . 理想情况下,我想实现这个 without 将所有内容放入一个ModelAdmin类中,并编写自己的'urls'函数以根据URL返回不同的查询集 .
我已经看过Django源了,我看到像 ModelAdmin.changelist_view
这样的函数可能以某种方式包含在我的urls.py中,但我不确定它究竟是如何工作的 .
Update :我仍然希望听到其他方法 .
3 回答
我找到了一种方法来实现我想要的,通过使用代理模型来解决每个模型只能注册一次的事实 .
然后可以在/ admin / myapp / post访问默认的PostAdmin,用户拥有的帖子列表位于/ admin / myapp / myposts .
看了http://code.djangoproject.com/wiki/DynamicModels后,我想出了以下函数实用函数来做同样的事情:
这可以使用如下:
Paul Stone的回答绝对棒极了!只是为了添加,对于Django 1.4.5我需要从
admin.ModelAdmin
继承我的自定义类只需使用list_filter或date_hierarchy .