Проверка условий с помощью функции 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'))