有没有办法让 wagtail modeladmin 中的每个用户都可以看到数据?

Is there a way to make data visible per user in wagtail modeladmin?

我在 wagtail admin ModelAdmin 中添加了一个家谱管理器,结构是这样的:

Clients/
    Management
    Family Tree/
        Person/

所以我需要确保每个家谱和人(家谱的成员)只对输入数据的用户(和管理员)可用。

这是我第一次使用 wagtail,我刚刚阅读了文档,但欢迎任何建议 :)

正在模型管理视图上过滤

在您的 ModelAdmin class 上,您应该定义 get_queryset 以根据需要过滤列表视图中显示的项目。

但是它只会不显示项目,用户仍然可以通过修改 URL 来访问其他项目。为了防止这种情况,您需要相应地定义 permission_helper_class and set the user_can_inspect, user_can_create, user_can_edit and user_can_delete methods 到 return True/False。

正在将用户分配给创建的对象

根据您在下方的评论,我们假设您具有以下模型定义:

from django.conf import settings
from django.db import models

class FamilyTree(models.Model):
    managed_by = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
    # Some other fields.

请注意,如果数据库中已有一些条目,null=False 将失败。如果是这种情况,您将不得不创建一些 custom migrations.

为了将创建对象的用户分配给对象本身,您必须 override the CreateView 使用自定义模型管理员。

from django.forms.widgets import HiddenInput
from wagtail.contrib.modeladmin.views import CreateView

class FamilyTreeCreateView(CreateView):
    def get_form(self):
        form = super().get_form()
        form.fields['managed_by'].widget = HiddenInput()
        return form

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['data']['managed_by'] = self.request.user  # Add the data so the form validates properly.
        return kwargs

请注意,通过这种方式,它将输出一个隐藏的 managed_by 表单字段,您稍后可以将其设置为正确的值。如果这对您来说是个问题,您将不得不 exclude the field 然后覆盖 form_valid 方法。我选择不这样做是因为你必须完全覆盖该方法(经验表明 Wagtail 的给定更新将与你复制的实现不同,你不会注意到),而不仅仅是 override/extend 它作为初始方法调用form.save() 这将失败,因为缺少必需的 managed_by 字段。

然后在您的模型管理员上设置此视图:

from wagtail.contrib.modeladmin.options import ModelAdmin
from myviews import FamilyTreeCreateView

class FamilyTreeAdmin(ModelAdmin):
    create_view_class = FamilyTreeCreateView