Локальная 'переменная', на которую ссылаются перед присвоением
Я написал сигнал, который изменяет поле внутри модели пользователя. он работает нормально, но когда пользователь регистрируется в первый раз, он выдает мне такую ошибку:
UnboundLocalError: local variable 'scientific' referenced before assignment
вот мой сигнал:
@receiver(pre_save, sender=User, dispatch_uid='progress_change')
def progress(sender, instance, **kwargs):
user = instance
if ScientificInfo.objects.filter(user=user).exists():
scientific = ScientificInfo.objects.get(user=user)
if ReligiousInfo.objects.filter(user=user).exists():
religious = ReligiousInfo.objects.get(user=user)
if PsychologicInfo.objects.filter(user=user).exists():
psychological = PsychologicInfo.objects.get(user=user)
if InvestigationInfo.objects.filter(user=user).exists():
investigation = InvestigationInfo.objects.get(user=user)
if scientific.is_interviewed == False and religious.is_interviewed == False and psychological.is_interviewed == False and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[1][0]
if scientific.is_interviewed == True and religious.is_interviewed == False and psychological.is_interviewed == False and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[2][0]
if scientific.is_interviewed == True and religious.is_interviewed == True and psychological.is_interviewed == False and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[3][0]
if scientific.is_interviewed == True and religious.is_interviewed == True and psychological.is_interviewed == True and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[4][0]
if scientific.is_interviewed == True and religious.is_interviewed == True and psychological.is_interviewed == True and investigation.is_interviewed == True:
user.progress_level = USER_PROGRESS_LEVELS[5][0]
Я думаю, что pre_save вызывает проблему, потому что когда я меняю его на post_save, пользователи могут зарегистрироваться, но сигнал тогда не работает. что я должен сделать, чтобы решить эту проблему?
Потому что вы определили переменную scientific внутри оператора if и при обращении к ней в if scientific.is_interviewed == False она говорит, что не определена. Поэтому вы должны определить переменную scientific перед оператором if со значением default.
@receiver(pre_save, sender=User, dispatch_uid='progress_change')
def progress(sender, instance, **kwargs):
user = instance
scientific = religious = psychological = investigation = None #< ----- initialize variable
if ScientificInfo.objects.filter(user=user).exists():
scientific = ScientificInfo.objects.get(user=user)
if ReligiousInfo.objects.filter(user=user).exists():
religious = ReligiousInfo.objects.get(user=user)
if PsychologicInfo.objects.filter(user=user).exists():
psychological = PsychologicInfo.objects.get(user=user)
if InvestigationInfo.objects.filter(user=user).exists():
investigation = InvestigationInfo.objects.get(user=user)]
if scientific.is_interviewed == False and religious.is_interviewed == False and psychological.is_interviewed == False and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[1][0]
if scientific.is_interviewed == True and religious.is_interviewed == False and psychological.is_interviewed == False and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[2][0]
if scientific.is_interviewed == True and religious.is_interviewed == True and psychological.is_interviewed == False and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[3][0]
if scientific.is_interviewed == True and religious.is_interviewed == True and psychological.is_interviewed == True and investigation.is_interviewed == False:
user.progress_level = USER_PROGRESS_LEVELS[4][0]
if scientific.is_interviewed == True and religious.is_interviewed == True and psychological.is_interviewed == True and investigation.is_interviewed == True:
user.progress_level = USER_PROGRESS_LEVELS[5][0]