Вложенная функция работает, но возвращает сообщения в Django
У меня есть функция, вызываемая внутри другой функции. Функции работают правильно, но при использовании валидатора, чтобы выдать ошибку в случае неправильного ввода пользователем, валидатор работает, но вызывает либо сообщение об успехе, либо об ошибке.
Я размещаю некоторый код для лучшего объяснения.
utils.py
flight_validator:
def flight_validator(request, ata, etd, function_type, instructor):
if 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, ""
enter code here
views.py
def add_new_flight(request):
aircrafts = Aircraft.objects.all()
aerodromes = Aerodrome.objects.filter(is_base=False)
base_aerodrome = Aerodrome.objects.get(is_base=True)
function_type = FunctionType.objects.all()
students = Student.objects.filter(is_active=True).order_by('last_name')
instructors = Instructor.objects.filter(
is_active=True).order_by('last_name')
operational_conditions = OperationalCondition.objects.all()
today = dt.today().date()
try:
aircraft_maintenance_type = AircraftMaintenanceType.objects.first()
except:
aircraft_maintenance_type = None
context = {
'aircrafts': aircrafts,
'aerodromes': aerodromes,
'function_type': function_type,
'students': students,
'instructors': instructors,
'today': today,
'operational_conditions': operational_conditions,
'base_aerodrome': base_aerodrome,
'aircraft_maintenance_type': aircraft_maintenance_type,
}
if request.method == 'POST':
try:
add_flight_function(request)
messages.success(request, "New Flight Inserted Successfully")
return HttpResponseRedirect(reverse('flight:flight_list'))
except:
messages.error(request, "Failed to Add New Flight")
return HttpResponseRedirect(reverse('flight:add_new_flight'))
return render(request, 'flight/add_new_flight.html', context)
Если я делаю какую-то ошибку ввода, валидаторы работают правильно, но, например, показывают и ошибку, и сообщение об успехе. Но, на самом деле, сообщения об успехе не должно быть, и функция не работает и ничего не сохраняет.
Я думаю, что в вашей функции add_flight_function
вы хотите вызвать какую-то ошибку, чтобы поток кода перешел к блоку except. Сейчас вы возвращаете экземпляр ответа, который не используется в вашем представлении, и код просто переходит к следующим строкам, которые добавляют сообщение об успехе и возвращают перенаправление (блок try).
Так что исправление будет заключаться в том, чтобы делать это везде, где вы возвращаете HttpResponseRedirect
в add_flight_function
:
messages.error(request, error_message)
raise ValidationError(error_message)
# return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
Примечание: было бы лучше, если бы вы использовали формы Django для всего этого.