在Wagtail Modeladmin中是否可以使每个用户看到数据?

时间:2019-01-24 04:22:02

标签: permissions wagtail modeladmin

我要在w管理员AdminAdmin中添加家谱管理器,其结构如下:

Clients/
    Management
    Family Tree/
        Person/

因此,我需要确保每个族谱和Person(族谱的成员)仅对输入数据的用户(和管理员)可用。

这是我第一次玩w,我只是看了文档,但是欢迎任何建议:)

1 个答案:

答案 0 :(得分:0)

在模型管理员视图上过滤

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

但是,它仅不显示项目,用户仍然可以通过修改URL来访问其他项目。为避免这种情况,您需要定义一个permission_helper_class并将user_can_inspectuser_can_createuser_can_edituser_can_delete methods设置为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的给定更新将不同于您复制的实现,并且您不会注意到),而不仅仅是在初始方法调用{{ 1}}会失败,因为缺少必填的form.save()字段。

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

managed_by