Проверка условий с помощью функции django views

Я пытаюсь сделать свой код более читабельным и менее многословным. У меня есть длинное представление, в котором есть несколько операторов if и elif для проверки некоторых условий. Я пытаюсь записать эту функцию в другой файл (utils.py) и использовать ее в представлении. Представление выглядит примерно так: views.py

        if float(ata_tacho) <= float(etd_tacho):
            messages.error(request, "ATA Tachometer cannot be greater or equal to ETD Tachometer")
            return HttpResponseRedirect(reverse('flight:add_new_flight'))
        elif ata <= etd:
            messages.error(request, "ATA cannot be greater or equal to ETD!")
            return HttpResponseRedirect(reverse('flight:add_new_flight'))

        elif function_type_obj.name == 'Dual Command' and not instructor:
            messages.error(request, "Instructor must be on Board!")
            return HttpResponseRedirect(reverse('flight:add_new_flight'))
More code to run only if conditions above are satisfied

Вот некоторые условия, которые мне нужно проверить, чтобы продолжить выполнение кода. Пока все хорошо. Если я попробую написать эту функцию в более общем виде в файле utils.py, как показано ниже:

utils.py

def flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type, instructor):
    if float(ata_tacho) <= float(etd_tacho):
         messages.error(request, "ATA Tachometer cannot be greater or equal to ETD Tachometer")
         return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    elif ata <= etd:
        messages.error(request, "ATA cannot be greater or equal to ETD!")
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

    elif function_type == 'Dual Command' and not instructor:
        messages.error(request, "Instructor must be on Board!")
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

И я вызываю функцию в представлении следующим образом:

        flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type_obj.name, instructor)

Что происходит, так это то, что в основном этот кусок кода работает, но НЕ останавливает остальную часть представления, чтобы сохранить свою работу. То есть, он возвращает сообщения об ошибках, но не останавливает остальную часть представления. Я думаю, что, возможно, я упускаю какой-то возврат или не знаю, что я делаю неправильно.

Действительно, если вы просто вызовете flight_validator таким образом, его возвращаемое значение будет просто проигнорировано.

Быстрым решением может быть:

views.py:

redirection = flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type_obj.name, instructor)

if redirection is not None:
    return redirection

Альтернатива 1:

Но это, вероятно, лучшая практика, чтобы сохранить HTTP-ответ инициализированным в представлениях.

utils.py:

def flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type, instructor):
    if float(ata_tacho) <= float(etd_tacho):
        messages.error(request, "ATA Tachometer cannot be greater or equal to ETD Tachometer")
        return False
    elif ata <= etd:
        messages.error(request, "ATA cannot be greater or equal to ETD!")
        return False
    elif function_type == 'Dual Command' and not instructor:
        messages.error(request, "Instructor must be on Board!")
        return False

    return True

views.py:

is_valid_flight = flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type_obj.name, instructor)

if not is_valid_flight:
    return HttpResponseRedirect(reverse('flight:add_new_flight'))

Альтернатива 2:

С учетом сказанного, вы можете даже учесть немного больше:

utils.py:

def flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type, instructor):
    if float(ata_tacho) <= float(etd_tacho):
        return False, "ATA Tachometer cannot be greater or equal to ETD Tachometer"
    elif ata <= etd:
        return False, "ATA cannot be greater or equal to ETD!"
    elif function_type == 'Dual Command' and not instructor:
        return False, "Instructor must be on Board!"

    return True, ""

views.py:

is_valid_flight, error_message = flight_validator(request, ata_tacho, etd_tacho, ata, etd, function_type_obj.name, instructor)

if not is_valid_flight:
    messages.error(request, error_message)
    return HttpResponseRedirect(reverse('flight:add_new_flight'))
Вернуться на верх