首页 文章

Django admin中相同模型的多个ModelAdmins /视图

提问于
浏览
134

如何为同一模型创建多个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 回答

  • -1

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

    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)
    
  • 3

    Paul Stone的回答绝对棒极了!只是为了添加,对于Django 1.4.5我需要从 admin.ModelAdmin 继承我的自定义类

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

    只需使用list_filter或date_hierarchy .

    date_hierarchy = 'pub_date'
    
    list_filter = ['pub_date',]
    

相关问题