如何为同一模型创建多个ModelAdmin,每个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上访问该文件.但是,我希望同一模型有多个视图/模型管理员.e、 G/admin/myapp/post将列出所有帖子对象,/admin/myapp/myposts将列出属于用户的所有帖子,/admin/myapp/draftpost可能列出所有尚未发布的帖子.(这些只是示例,我的实际用例更复杂)

您不能为同一模型注册多个ModelAdmin(这会导致AlreadyRegistered异常).理想情况下,我希望实现这个without,将所有内容都放到单个ModelAdmin类中,并编写我自己的"URL"函数,以根据URL返回不同的查询集.

我已经看过Django源代码,我看到像ModelAdmin.changelist_view这样的函数可以以某种方式包含在我的urls.py中,但是我不确定它到底是如何工作的.

Update:我已经找到了一种做我想做的事情的方法(见下文),但我还是想听听其他的方法.

推荐答案

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

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)

则在/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相关问答推荐

Htmx如何从事件中访问数据?

社工/社工简戈

一次请求中更新整个Django模型

Django 表单字段必填和可选配置

Django 过滤器:过滤隐藏在多层模型 struct 中的对象

带有代码完成功能的 python / django 的 Sublime Text 2 和 3 设置

Django过滤器查询外键

django 用一个提交按钮提交两种不同的表单

Django:通过manage.py使用服务器和gunicorn等其他服务器之间的区别.哪个更好?

使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败

使用 sqlite 运行 django 测试

整数的Python正则表达式?

Django ALLOWED_HOSTS IP 范围

Django Rest Framework - 缺少静态目录

django admin 排序外键字段列表

如何重置 PostgreSQL 表上的 ID 序列

Django 自定义用户邮箱帐户验证

用于创建和更新的基于 Django 类的视图

使用 request.user 的 Django 和中间件始终是匿名的

在 django 中获取空查询集的类名