Django中MultiSelectField默认值设置及邮件偏好判断
解决方案
1. 设置email_preferences默认选中所有选项
修改Account模型中的email_preferences字段,添加default参数,值为所有偏好选项的value组成的列表:
class Account(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) joined_groups = models.ManyToManyField(Group, related_name='joined_group', blank=True) created_groups = models.ManyToManyField(Group, blank=True) EMAIL_PREFERENCES = [ ('user_emails', 'User Emails'), ('group_emails', 'Group Emails'), ('leader_emails', 'Leader Emails'), ] email_preferences = MultiSelectField( verbose_name = 'Email Preferences', choices=EMAIL_PREFERENCES, blank=True, max_choices=3, max_length=255, # 添加默认值,选中所有选项 default=['user_emails', 'group_emails', 'leader_emails'] )
新用户注册时,创建的Account实例会自动默认选中所有邮件偏好。若需处理已存在的用户数据,可通过数据迁移或后台批量更新完成默认值设置。
2. 在视图中判断是否发送邮件通知
在CreateGroup的form_valid方法中,先将用户的email_preferences分割为列表,再判断'leader_emails'是否在列表中,满足条件才触发邮件任务:
class CreateGroup(CreateView): model = Group form_class = GroupForm template_name = 'create_group.html' def form_valid(self, form): group = form.save() group.joined.add(self.request.user) account = self.request.user.account account.created_chaburahs.add(group) account.joined_chaburahs.add(group) email = account.user.email # 判断用户是否开启Leader Emails偏好 preferences = account.email_preferences.split(',') if account.email_preferences else [] if 'leader_emails' in preferences: # celery task to send email create_group_notification_task.delay(email) return HttpResponseRedirect(reverse('group_detail', args=[str(group.pk)]))
如果使用的是django-multiselectfield库,该字段会自动将存储的字符串转为列表,此时可直接用if 'leader_emails' in account.email_preferences:判断,无需手动分割。
内容的提问来源于stack exchange,提问作者Yehuda
相关产品推荐
相关产品推荐

