Локальная 'переменная', на которую ссылаются перед присвоением

Я написал сигнал, который изменяет поле внутри модели пользователя. он работает нормально, но когда пользователь регистрируется в первый раз, он выдает мне такую ошибку:

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]
Вернуться на верх