a用户实例的默认通知设置似乎是“在提交页面进行审核时接收通知”,这不符合我们的需求:我们不希望每一个w用户都在收到通知时通过电子邮件发送给每个ag用户页面被提交以进行审核。
此用户通知设置的默认值为“ True”:
# wagtail/wagtail/users/models.py
# https://github.com/wagtail/wagtail/blob/master/wagtail/users/models.py#L25
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
submitted_notifications = models.BooleanField(
verbose_name=_('submitted notifications'),
default=True,
help_text=_("Receive notification when a page is submitted for moderation")
)
...,我想将默认值更改为“ False”(例如,用户应选择加入以获得电子邮件通知)。
但我不知道此任务的“最佳做法”是什么。
我完全惊讶于这个问题,因为我假设只有“版主”组/角色的成员会收到通知。 (事实并非如此)。
我尝试过的想法:
从语法上修改此设置(有效):
可以通过shell修改现有的用户实例:
./manage.py shell
from django.contrib.auth import get_user_model
User = get_user_model()
for user in User.objects.all():
user.wagtail_userprofile.update(submitted_notifications=False)
user.wagtail_userprofile.save()
在我的CustomUser save()方法中修改此设置(不能工作):
# project/users/models.py (pseudocode)
class CustomUser(AbstractUser):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.wagtail_userprofile.update(submitted_notifications=False)
self.wagtail_userprofile.save()
这会引发“ RelatedObjectDoesNotExist”错误。
添加数据迁移以更改默认值(只是一个想法–我不知道这是一个选项还是如何实现)。
设置:
答案 0 :(得分:1)
您可以使用发布后保存信号
import UserProfile from wagtail.users.models
@receiver(post_save, sender=UserProfile)
def update_user_profile(sender, instance, created, **kwargs):
if created:
instance.submitted_notifications = False
instance.save()
因此,这会在创建新配置文件时触发,并将“ submitted_notifications”默认设置为False。希望对您有帮助
答案 1 :(得分:0)
在save方法中更新相关配置文件会引发RelatedObjectDoesNotExist
的原因是因为相关对象是在保存后创建的。数据库事务需要提交以获取主键。显然,您需要一个pk来存储关系。
这就是信号起作用的原因。 db事务完成后,将触发后保存信号。我认为信号可以有效解决您的问题。
您也可以在保存方法中使用transaction.on_commit
。提交后,等待事务完成。
有时,您需要执行与当前数据库事务相关的操作,但前提是事务成功提交。示例可能包括Celery任务,电子邮件通知,缓存无效或在相关对象中设置一些默认值。这是关于该主题的文档: https://docs.djangoproject.com/en/1.11/topics/db/transactions/#performing-actions-after-commit
在模型中执行以下操作:
from django.db import transaction
class Foo(...):
...
def save(self, *args, **kwargs):
instance = super().save(*args, **kwargs)
if not self.pk:
transaction.on_commit(self.update_profile)
return instance
def update_profile(self):
self.wagtail_userprofile.update(submitted_notifications=False)
# Note: update, no need to call save.
# Signals will not be fired on behalf of the UserProfile.
免责声明,我没有运行/测试此代码。