【发布时间】:2021-07-12 18:26:20
【问题描述】:
我的应用中有一个名为“portal”的模型,位于portal/models.py:
from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save
from wagtail.snippets.models import register_snippet
from wagtail.admin.edit_handlers import FieldPanel
@register_snippet
class StaffRoles(models.Model):
role = models.CharField(max_length=154, unique=True, help_text="Create new staff roles here, these roles an be assigned to 'staff' users.")
panels = [
FieldPanel('role'),
]
def __str__(self):
return self.role
class Meta:
verbose_name = "Staff Role"
verbose_name_plural = "Staff Roles"
@register_snippet
class Staff(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=1024, blank=True)
roles = models.ManyToManyField(StaffRoles, blank=True)
def __str__(self):
return str(self.user.first_name) + " " + str(self.user.last_name)
class Meta:
verbose_name = "Staff"
verbose_name_plural = "Staff"
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created and instance.is_superuser:
Staff.objects.create(user=instance)
任何新的超级用户都会自动获得Staff 模型。任何现有(非超级用户)用户也可以添加为Staff。
我希望员工能够设置bio 和role。角色可以通过 Wagtail 管理员的 Snippets 页面添加。
现在,Staff 已注册为 sn-p,这意味着任何员工都可以编辑其他员工的员工属性。
我想通过向每个用户各自的员工属性添加一个表单来自定义 Wagtail 用户帐户设置。这样,我可以锁定 Staff sn-p,这样每个拥有链接到其User 模型的Staff 对象的用户都只能更改他们自己的Staff 字段/属性。
根据 here 的 Wagtail 文档,我首先创建了文件 portal/forms.py,其内容为:
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from wagtail.users.models import UserProfile
from .models import Staff
class CustomStaffSettingsForm(forms.ModelForm):
class Meta:
model = Staff
exclude = []
还有另一个文件portal/wagtail_hooks.py 的内容:
from wagtail.admin.views.account import BaseSettingsPanel
from wagtail.core import hooks
from .forms import CustomStaffSettingsForm
@hooks.register('register_account_settings_panel')
class CustomStaffSettingsPanel(BaseSettingsPanel):
name = 'custom_staff'
title = "Staff settings"
order = 500
form_class = CustomStaffSettingsForm
form_object = 'profile'
这不能按预期工作。访问“帐户设置”并向下滚动到“员工设置”时,我可以按预期看到CustomStaffSettingsForm。虽然在User 字段中预先选择了正确的用户,但我仍然可以选择其他用户。此外,不会检索 bio 和 roles 的存储值,也不会保存新值。
下面是 sn-ps 页面中用户“sid”的Staff 模型:
下面是“帐户设置”中Staff settings 部分的外观。
如您所见,虽然User 下拉菜单选择了正确的用户,但我仍然可以单击并选择另一个用户。 bio 和 roles 字段未填充来自 sn-ps 页面的正确值,并且未在图片中显示,填充和保存值不起作用。
我希望我的问题尽可能详细,我该如何解决这个问题?
【问题讨论】:
标签: python django model wagtail one-to-one