Я пытаюсь сделать свой код более читабельным и менее подробным. У меня есть это длинное представление, где у меня есть операторы if и elif для проверки некоторых условий. Что я пытаюсь сделать, так это записать эту функцию в другой файл (utils.py) и использовать эту функцию в представлениях. Вид примерно такой: просмотры.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'))