有没有办法让 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
我在 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