1

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

Clients/
    Management
    Family Tree/
        Person/

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

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

4

1 回答 1

2

过滤模型管理视图

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

但是它不会显示项目,用户仍然可以通过修改 URL 来访问其他项目。为了防止这种情况,您需要定义 apermission_helper_class并将user_can_inspectuser_can_create方法user_can_edit设置为相应地返回 True/False。user_can_delete

将用户分配给创建的对象

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

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如果您在数据库中已经有一些条目,则会失败。如果是这种情况,您将不得不创建一些自定义迁移

为了将创建对象的用户分配给对象本身,您必须使用自定义的模型管理员来覆盖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表单字段,您稍后将其设置为正确的值。如果这对您来说是个问题,您将不得不排除该字段,然后覆盖该form_valid方法。我选择不这样做是因为您必须完全覆盖该方法(并且经验表明,Wagtail 的给定更新将与您复制的实现不同,您不会注意到),而不仅仅是覆盖/扩展它作为初始方法form.save()调用由于缺少必填managed_by字段而失败。

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

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

class FamilyTreeAdmin(ModelAdmin):
    create_view_class = FamilyTreeCreateView
于 2019-01-24T09:55:02.153 回答