python - Django admin 中同一模型的多个 ModelAdmins/ View

标签 python django django-admin

如何为同一个模型创建多个 ModelAdmin,每个模型都以不同方式定制并链接到不同的 URL?

假设我有一个名为 Posts 的 Django 模型。默认情况下,此模型的管理 View 将列出所有 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 访问。但是我想拥有同一个模型的多个 View /模型管理员。例如 /admin/myapp/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 MyPost(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)

然后默认的 PostAdmin 可以在 /admin/myapp/post 访问,用户拥有的帖子列表将在 /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)

关于python - Django admin 中同一模型的多个 ModelAdmins/ View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223375/

相关文章:

Python/Django - 从对象变量值中获取带有索引的列表值

python - 在python中按字符分隔字符串

python - 两次使用 apply() 创建新列会导致覆盖新列

python - 无权在 MongoDB 上使用服务连接器执行任何命令

python - django - int 参数必须是字符串或数字,而不是 'Tuple'

python - Django - Apache : get extended key usage field from x509 client certificate

django admin 外键字段数据添加

python - 注册内联管理员而不删除其他内联包

django - 博客中的类别。它们如何工作?

python - Django Formsets - form.is_valid() 为 False 阻止表单集验证