Django管理中的同一模型的多个ModelAdmins / views

我如何为同一个模型创建多个ModelAdmin,每个模型都进行了不同的定制并链接到不同的URL?

假设我有一个名为Posts的Django模型。 默认情况下,此模型的管理视图将列出所有Post对象。

我知道我可以通过设置像list_display这样的变量或在我的ModelAdmin中重写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会列出所有的post对象,而/admin/myapp/myposts会列出属于该用户的所有帖子,而/admin/myapp/draftpost可能会列出所有尚未发布的帖子。 (这些仅仅是例子,我的实际使用情况更复杂)

您无法为同一模型注册多个ModelAdmin(这会导致AlreadyRegistered异常)。 理想情况下,我希望在将所有内容都放入单个ModelAdmin类的同时编写自己的“urls”函数以根据URL返回不同的查询集。

我看了一下Django的源代码,并且看到了像ModelAdmin.changelist_view这样的函数,它可能以某种方式包含在我的urls.py中,但我不确定这是如何工作的。

更新 :我发现了一种做我想做的事情的方式(见下文),但我仍然希望听到其他的做法。


我找到了一种方法来实现我想要的,通过使用代理模型来解决每个模型只能注册一次的事实。

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pubdate','user')

class MyPosts(Post):
    class Meta:
        proxy = True

class MyPostAdmin(PostAdmin):
    def get_queryset(self, request):
        return self.model.objects.filter(user = request.user)


admin.site.register(Post, PostAdmin)
admin.site.register(MyPost, MyPostAdmin)

然后,可以在/ admin / myapp / post访问默认的PostAdmin,用户拥有的帖子列表位于/ admin / myapp / myposts。

看过http://code.djangoproject.com/wiki/DynamicModels之后,我想出了下面的函数实用函数来做同样的事情:

def create_modeladmin(modeladmin, model, name = None):
    class  Meta:
        proxy = True
        app_label = model._meta.app_label

    attrs = {'__module__': '', 'Meta': Meta}

    newmodel = type(name, (model,), attrs)

    admin.site.register(newmodel, modeladmin)
    return modeladmin

这可以使用如下:

class MyPostAdmin(PostAdmin):
    def get_queryset(self, request):
        return self.model.objects.filter(user = request.user)

create_modeladmin(MyPostAdmin, name='my-posts', model=Post)

保罗斯通的答案绝对好! 仅仅为了添加Django 1.4.5,我需要从admin.ModelAdmin继承我的自定义类

class MyPostAdmin(admin.ModelAdmin):
    def queryset(self, request):
        return self.model.objects.filter(id=1)

只需使用list_filter或date_hierarchy。

date_hierarchy = 'pub_date'

list_filter = ['pub_date',]
链接地址: http://www.djcxy.com/p/65415.html

上一篇: Multiple ModelAdmins/views for same model in Django admin

下一篇: How to add 'collapse' to a Django StackedInline