我发现了这个问题的两种不同的解决方案。
- 实施 ModelAdmin 以创建模型的自定义页面列表视图。这使您可以创建一个全新的管理菜单项和相应的列表视图。这种方法涉及更多,但提供了更多控制。
- 实施 construct_explorer_page_queryset 管理挂钩以按组过滤结果。此方法快速且易于实施,并允许您使用 Wagtails 现有的页面浏览器。
我将介绍我是如何处理上述每种方法的。两者都有效,这是一个决定我是否更喜欢使用内置页面浏览器的 Wagtails 的问题。
方法一:模型管理
在 Wagtail Docs here 中找到了 ModelAdmin.get_queryset() 和其他有用方法的使用。
根据 Wagtail 文档中的 this page,我将 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 文档中的钩子信息 - 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
这就是第二种方法。