我正在创建一个wagtail网站,用户可以在其中注册,登录wagtail管理员并撰写文章页面进行发布。是否有一个钩子或可能的方法来拦截和过滤wagtail管理员中的数据,以便用户只看到他们自己创建的文章页面?
到目前为止,我已经使用django-allauth设置了用户注册,用户可以成功登录。注册后,user_signed_up接收器将触发,并且用户被分配到“作者”角色。在管理员中,作者只能访问添加文章。文章是一个带有文章索引页面和文章页面的应用程序(基本上是博客和博客索引页面)。一旦他们登录他们看到的唯一的东西是左边的页面选项卡,点击它将他们带到'文章'列表。这是他们能够添加“文章”页面并查看到目前为止创建的文章的地方。
这也是我的问题所在。在文章列表页面中,用户可以看到网站上所有用户创建的所有文章。他们只能编辑他们自己的伟大,但最终会有来自其他用户的数百篇文章。有没有办法在显示之前拦截'文章'数据并由当前用户过滤?
拦截此数据的结果将使登录到wagtail管理员的每个用户仅知道他们创建的文章页面。
非常感谢,这是我第一次使用Wagtail,到目前为止我很喜欢它。
我发现了这个问题的两种不同解决方案。
我将讨论如何处理上述每种方法。两者都有效,这是一个决定我是否更喜欢使用内置于页面浏览器中的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
这是第二种方法。