gpt4 book ai didi

wagtail - 如何过滤 wagtail 管理中的页面列表,以便编辑者只能看到他们创建的页面?

转载 作者:行者123 更新时间:2023-12-04 01:44:33 27 4
gpt4 key购买 nike

我正在创建一个 wagtail 站点,用户可以在其中注册、登录到 wagtail 管理员并编写要发布的文章页面。是否有一个钩子(Hook)或可能的方法来拦截和过滤 wagtail 管理中的数据,以便用户只能看到他们自己创建的文章页面?

到目前为止,我已经使用 django-allauth 设置了用户注册,并且用户能够成功登录。注册后,user_signed_up 接收器将触发,用户将被分配到“作者”角色。在管理员中,作者只能添加文章。 Articles 是一个带有文章索引页和文章页(基本上是博客和博客索引页)的应用程序。一旦他们登录,他们唯一看到的就是左侧的“页面”选项卡,单击该选项卡会将他们带到“文章”列表。他们可以在此处添加“文章”页面并查看到目前为止创建的文章。

这也是我的问题所在。在文章列表页面,用户可以看到站点上所有用户创建的所有文章。他们只能编辑自己的,这很好,但最终会有数百篇来自其他用户的文章。有没有办法在显示之前拦截“文章”数据并由当前用户过滤?

拦截此数据的结果将使登录到 wagtail 管理员的每个用户只知道他们创建的文章页面。

非常感谢,这是我第一次使用 Wagtail,到目前为止我很享受。

最佳答案

我发现了这个问题的两种不同的解决方案。

  1. 实现 ModelAdmin 以创建模型的自定义页面 ListView 。这使您可以创建一个全新的管理菜单项和相应的 ListView 。此方法涉及更多,但提供更多控制。
  2. 实现 construct_explorer_page_queryset 管理 Hook 以按组归档结果。此方法实现起来快速且容易,并允许您使用 Wagtails 现有的页面浏览器。

我将介绍我是如何处理上述每种方法的。两者都有效,这取决于我是否更喜欢使用页面浏览器中内置的 Wagtails。

方法一:ModelAdmin

在 Wagtail 文档中找到了 ModelAdmin.get_queryset() 和其他有用方法的使用 here .

根据 this page在 Wagtail 文档中,我将 ModelAdmin 添加到 INSTALLED_APPS:

# base.py settings

INSTALLED_APPS = [
...
'wagtail.contrib.modeladmin',
]

然后我在我的“文章”应用中创建了一个名为 wagtail_hooks.py 的文件。在该文件中,我添加了代码以在管理员中创建我的文章列表页面:

# wagtail_hooks.py

from wagtail.contrib.modeladmin.options import (ModelAdmin, modeladmin_register)
from .models import Article


class ArticleAdmin(ModelAdmin):
model = Article
menu_label = 'Articles'
menu_icon = 'doc-full-inverse'
menu_order = 000
add_to_settings_menu = False
exclude_from_explorer = False
list_display = ('title', 'owner')
search_fields = ('title', 'owner')

def get_queryset(self, request):
qs = super().get_queryset(request)
#only show articles from the current user
return qs.filter(owner=request.user)


modeladmin_register(ArticleAdmin)

这里的关键是实现 ModelAdmin.get_queryset(),这让我可以过滤文章所有者。

您可能还想删除页面浏览器菜单项,因为它有点多余。我还建议也实现下面的方法 2。即使您删除了页面浏览器菜单项,用户也可能通过直接在浏览器中输入 URL 来到达那里。如果他们这样做,实现方法 2 将确保他们看不到其他用户创作的内容。

方法二:construct_explorer_page_queryset @hooks

Wagtail 文档中的 Hook 信息 - construct_explorer_page_queryset还引用了这篇 Google 网上论坛文章 - https://groups.google.com/forum/#!topic/wagtail/10tcq8PB8io

在我上面创建的同一个 wagtail_hooks.py 文件中,我添加了这段代码:

@hooks.register('construct_explorer_page_queryset')
def show_authors_only_their_articles(parent_page, pages, request):
user_group = request.user.groups.filter(name='Author').exists()
if user_group:
pages = pages.filter(owner=request.user)

return pages

这就是第二种方法。

关于wagtail - 如何过滤 wagtail 管理中的页面列表,以便编辑者只能看到他们创建的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55844039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com