Permissions 在wagtail modeladmin中有没有一种方法可以让每个用户都可以看到数据?

Permissions 在wagtail modeladmin中有没有一种方法可以让每个用户都可以看到数据?,permissions,wagtail,modeladmin,Permissions,Wagtail,Modeladmin,我在wagtail admin ModelAdmin中添加了一个家族树管理器,其结构如下: Clients/ Management Family Tree/ Person/ 因此,我需要确保每个家谱和个人(家谱的成员)只对输入数据的用户(和管理员)可用 这是我第一次使用wagtail,我刚刚阅读了文档,但欢迎提供任何建议:)在模型管理视图中进行筛选 在ModelAdmin类上,您应该根据需要定义以过滤列表视图上显示的项目 但是,它不仅不会显示项目,用户还可以通过

我在wagtail admin ModelAdmin中添加了一个家族树管理器,其结构如下:

Clients/
    Management
    Family Tree/
        Person/
因此,我需要确保每个家谱和个人(家谱的成员)只对输入数据的用户(和管理员)可用

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

在模型管理视图中进行筛选 在ModelAdmin类上,您应该根据需要定义以过滤列表视图上显示的项目

但是,它不仅不会显示项目,用户还可以通过修改URL访问其他项目。为了避免这种情况,您需要定义一个,并将
用户可以检查
用户可以创建
用户可以编辑
用户可以删除
设置为相应地返回真/假

将用户指定给创建的对象 根据您在下面的评论,假设您具有以下模型定义:

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
将失败。如果是这样的话,你必须创造一些

为了给创建对象的用户分配一个对象本身,您必须为模型管理员分配一个自定义对象

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
表单字段,稍后您将该字段设置为正确的值。如果这对您来说是个问题,那么您必须修改并覆盖
form\u valid
方法。我选择不这样做是因为您必须完全覆盖该方法(经验表明,给定的Wagtail更新与您复制的实现不同,您不会注意到),而不仅仅是在初始方法调用
form.save()时覆盖/扩展它
由于缺少所需的
managed\u by
字段,该操作将失败

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

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

class FamilyTreeAdmin(ModelAdmin):
    create_view_class = FamilyTreeCreateView

谢谢你的建议。但我还没有做到这一点。我尝试了get_queryset,但是我在shell中发现了问题。在模型中没有指定te用户。类FamilyTree(models.Model):由=models.OneToOneField(用户,on_delete=models.CASCADE)管理,如果没有null=True,则无法工作,并且用户未被链接。是的,仅将
OneToOneField
创建给
用户的
模型不会自动分配创建实例的用户,你必须自己处理这件事。我将编辑上面的答案以实现这一点。