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

问题描述 投票:1回答:1

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

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

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

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

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

wagtail
1个回答
2
投票

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

  1. 实现ModelAdmin以创建模型的自定义页面列表视图。这使您可以创建一个全新的管理菜单项和相应的列表视图。这种方法涉及更多,但提供更多控制。
  2. 按组实现construct_explorer_page_queryset管理挂钩到文件管理器结果。此方法快速且易于实现,并允许您使用Wagtails现有页面浏览器。

我将讨论如何处理上述每种方法。两者都有效,这是一个决定我是否更喜欢使用内置于页面浏览器中的Wagtails的问题。

方法1:ModelAdmin

在Wagtail Docs here中可以找到ModelAdmin.get_queryset()和其他有用方法的使用。

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

# base.py settings

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

然后我在我的'article'应用程序中创建了一个名为wagtail_hooks.py的文件。在该文件中,我添加了代码以在admin中创建我的文章列表页面:

# 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(),它允许我过滤文章所有者。

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

方法2:construct_explorer_page_queryset @hooks

Wagtail文档中的钩子信息 - construct_explorer_page_queryset也引用了这个Google Groups文章 - 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

这是第二种方法。

© www.soinside.com 2019 - 2024. All rights reserved.