Как получить доступ к определенному выбору в поле выбора django для условных утверждений
У меня есть модель Account, которая расширяет стандартную модель пользователя django:
class Account(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
joined_groups = models.ManyToManyField(Group, related_name='joined_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']
)
У меня также есть много задач celery, которые отправляют уведомления по электронной почте, когда пользователи создают, обновляют, удаляют, присоединяются или покидают группы. Однако я хочу, чтобы эти электронные письма отправлялись только в том случае, если пользователь этого хочет.
Когда новый пользователь регистрируется, его предпочтения по электронной почте по умолчанию принимают все письма, но у него есть возможность изменить свои предпочтения в этом представлении:
class EmailPreferencesUpdate(UpdateView):
model = Account
form_class = EmailPreferencesUpdateForm
template_name = 'accounts/update_email_preferences.html'
def form_valid(self, form):
instance = form.save()
email = instance.user.email
update_email_preferences_notification.delay(email)
return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))
Моя проблема в том, что я пытаюсь создать условия, прежде чем я запущу свои задачи celery, чтобы увидеть, разрешает ли пользователь этот тип электронной почты, но я не могу понять, как получить доступ к выбору пользователя, чтобы увидеть, был ли выбран этот конкретный выбор.
Например, у меня есть представление UserUpdate:
class UserUpdate(generic.UpdateView):
model = User
form_class = UserUpdateForm
template_name = 'accounts/update_user.html'
def get_object(self):
return self.request.user
def form_valid(self, form):
instance = form.save()
user = self.request.user
form.update_user_notification()
return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))
и я хочу добавить оператор if, когда форма подтверждается, чтобы проверить предпочтения электронной почты указанного пользователя. Я предполагаю, что это будет что-то вроде этого:
def form_valid(self, form):
instance = form.save()
user = self.request.user
if user.account.email_preferences.includes('user_emails')
form.update_user_notification()
return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))
Но это не сработало. Я просто не уверен, как получить доступ к полю выбора, чтобы узнать, выбран ли у пользователя определенный вариант.
На самом деле это не так сложно. Все, что мне нужно сделать, это проверить, существует ли тип электронной почты в выборе пользователя:
def form_valid(self, form):
instance = form.save()
user = self.request.user
if 'user_emails' in user.account.email_preferences:
form.update_user_notification()
return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))
и это сработало. Посмотрим, сработает ли это для фактического обновления настроек уведомлений по электронной почте пользователя, потому что я не уверен, что запускается первым, задача celery или обновление настроек электронной почты.