Изменить логическое значение для пользовательского объекта

#django #django-models #django-views

#django #django-модели #django-представления

Вопрос:

Я хочу иметь возможность изменять логическое значение «sendmail» для пользователя с помощью моего представления. Но после добавления объекта один раз для пользователя со значением True я больше не могу его изменить, потому что я получаю «Ошибка целостности в / accounts /send_me_email / столбец user_id не уникален». Что я делаю не так?

models.py

класс SendMeMail (модели.Модель):
 пользователь = модели.ForeignKey (пользователь, уникальный = True)
 отправка почты = модели.BooleanField()
views.py

из userprofile.models импортировать SendMeMail 
def send_me_email(запрос):
 """
 Определите, нужны ли пользователю уведомления по электронной почте или нет 
 """

 # Проверьте текущее значение sendmail и действуйте соответствующим образом 
 sendme = Отправить электронную почту (user=request.user)

 если sendme.sendmail == False: 
 sendme.sendmail = True 
 sendme.save()
 если sendme.sendmail == True:
 sendme.sendmail = False 
 sendme.save()
 еще: 
 sendme.sendmail = True 
 sendme.save()

Ответ №1:

Эта строка:

 sendme = SendMeMail(user=request.user)
  

не делает того, что, как вы утверждаете, он делает. Он не загружает объект SendMeMail с текущим пользователем из базы данных — он создает новый объект для этого пользователя. Поскольку вы (правильно) объявили пользовательское поле уникальным, при сохранении произойдет сбой.

Вместо этого вы имеете в виду это:

 sendme = SendMeMail.objects.get(user=request.user)
  

Комментарии:

1. Конечно! В моем коде все еще есть некоторая проблема, поскольку он зависает на False, как только попадает туда, но я подозреваю, что это потому, что у меня есть два if: s друг за другом, и последний всегда меняет его на False then.

2. Да, просто измените второе if на elif .

Ответ №2:

и, возможно, изменить

 if sendme.sendmail == False:
    sendme.sendmail = True
    sendme.save()
if sendme.sendmail == True:
    sendme.sendmail = False
    sendme.save()
else:
    sendme.sendmail = True
    sendme.save()
  

Для

 sendme.sendmail = !sendme.sendmail
sendme.save()
  

я думаю, это короче)