我要在w管理员AdminAdmin中添加家谱管理器,其结构如下:
Clients/
Management
Family Tree/
Person/
因此,我需要确保每个族谱和Person(族谱的成员)仅对输入数据的用户(和管理员)可用。
这是我第一次玩w,我只是看了文档,但是欢迎任何建议:)
答案 0 :(得分:0)
在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的给定更新将不同于您复制的实现,并且您不会注意到),而不仅仅是在初始方法调用{{ 1}}会失败,因为缺少必填的form.save()
字段。
然后在模型管理员上设置此视图:
managed_by