【问题标题】:Is there a way to make data visible per user in wagtail modeladmin?有没有办法让 wagtail modeladmin 中每个用户的数据可见?
【发布时间】:2019-06-17 18:08:24
【问题描述】:

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

Clients/
    Management
    Family Tree/
        Person/

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

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

【问题讨论】:

    标签: permissions wagtail modeladmin


    【解决方案1】:

    过滤模型管理视图

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

    但是它不会显示项目,用户仍然可以通过修改 URL 来访问其他项目。为防止这种情况发生,您需要定义 permission_helper_class 并设置 user_can_inspect、user_can_create、user_can_edit 和 user_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 的给定更新将与您复制的实现不同,您不会注意到),而不仅仅是在初始方法调用 @987654339 时覆盖/扩展它@ 将失败,因为缺少必需的 managed_by 字段。

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

    from wagtail.contrib.modeladmin.options import ModelAdmin
    from myviews import FamilyTreeCreateView
    
    class FamilyTreeAdmin(ModelAdmin):
        create_view_class = FamilyTreeCreateView
    

    【讨论】:

    • 感谢您的建议 Loic。但我还没有做到这一点。我尝试了 get_queryset 但我在 shell 中发现的问题。是否未在模型中分配 te 用户。 class FamilyTree(models.Model): managed_by = models.OneToOneField(User, on_delete=models.CASCADE) 如果没有 null=True 就无法工作,并且用户没有被链接。
    • 是的,简单地为User 模型创建OneToOneField 不会自动分配创建实例的用户,您必须自己处理。我将在上面编辑我的答案以实现这一目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2010-10-26
    相关资源
    最近更新 更多