当前位置: 首页 > 面试题库 >

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

沈乐邦
2023-03-14
问题内容

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

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

我知道我可以通过设置变量如list_display或queryset在ModelAdmin中覆盖方法来以各种方式自定义页面上显示的对象列表:

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 / ModelAdmins。例如,/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)


 类似资料:
  • 问题内容: 在要显示已注册模型的管理站点的根页面上,我想隐藏已注册到Django admin的多个模型。 如果我直接注销这些记录,由于添加新符号“ +”消失了,因此我无法添加新记录。 如何才能做到这一点 ? 问题答案: 基于x0nix的答案,我做了一些实验。似乎从返回空会将模型从index.html中排除,同时仍然允许你直接编辑实例。

  • 一、简介 此功能可管理系统中会员模型、字段、以及模型的导入和导出功能。 二、功能演示 1.添加会员模型 2.管理会员模型 3.会员模型字段管理

  • 问题内容: 我正在尝试对同一模型中的两个字段使用相同的外键,并且出现错误。 我正在尝试建立主要和辅助通话用户,但是在收到以下错误后不确定如何格式化关系 问题答案: 您必须为两个列定义不同的名称。例如: 另请参阅文档: 用于从相关对象到此对象的关系的名称。它也是(用于目标模型的反向过滤器名称的名称)的默认值。有关完整的解释和示例,请参见相关的对象文档。注意,在抽象模型上定义关系时必须设置此值。并且当

  • 问题内容: 我有一个Django应用。当以管理员用户身份登录时,我希望能够在URL中传递一个秘密参数,并使整个网站的行为就像我是另一个用户一样。 假设我有显示当前登录用户个人资料的URL 。我希望能够做类似的事情,并使基础视图相信我实际上是ID 123的用户(因此呈现 该 用户的个人资料)。 我为什么要那样? 仅仅因为重现仅出现在单个用户帐户中的某些错误要容易得多。 我的问题: 实现这样的最简单的

  • 问题内容: 我想创建一个与用户类对象之间的多对多关系。 我有这样的事情: 问题是我是否可以在内部使用类引用。还是我必须使用欧洲工商管理学院的?还是有另一种(更好的)方法呢? 问题答案:

  • 问题内容: 如何在管理界面中将模型完全设为只读?它用于一种日志表,我在其中使用管理功能来搜索,排序,过滤等,但无需修改日志。 万一这看起来像是重复的,这不是我想要做的: 我不是在寻找只读字段(即使将每个字段都设为只读也可以让你创建新记录) 我不是要创建一个只读用户:每个用户都应该是只读的。 问题答案: templates / admin / view.html templates / admin