реализация редиректа на нужную страницу
Помогите разобраться с проблемой. Пишу проект на джанго. Имеется модель объекты которой я могу добавлять на разных страницах. При этом я хочу чтобы функция (view) создания модели была одна, для всех случаев вызова. Столкнулся с проблемой редиректа после исполнения основного кода. Необходимо чтобы логика отправляла пользователя на ту страницу с которой он пришел, при этом, если при обработке формы создания модели возникли ошибки то они передавались бы в нужный шаблон для вывода пользователю. Ниже моя реализация:
def add_project(request, ams_id):
try:
ams = Ams.objects.get(id=ams_id)
if request.method == 'POST':
# здесь next это строковый параметр который я передаю с шаблона hidden полем
next = request.POST['next']
# так как в next строка то необходимо определить функцию которая будет вызвана
if next == 'ams_detail':
func = ams_detail # функция view
elif next == 'project_list':
func = project_list # функция view
form = ProjectForm(request.POST, request.FILES)
if form.is_valid():
organization_name = request.POST['organization_name']
documentation = request.FILES['documentation']
year = request.POST['year']
project_instance = ams
obj = Project.objects.create(documentation=documentation, project_instance=project_instance,
year=year, organization_name=organization_name)
obj.save()
return func(request, ams_id=ams.id) # вызов необходимой функции с заданными параметрами
else:
msg = form_errors_text(form) # функция form_errors_text просто возвращает строковое значение ошибок формы
return func(request, ams_id=ams.id, msg=msg) # вызов необходимой функции с заданными параметрами
else:
return redirect('ams:ams_detail', ams_id=ams_id)
except ObjectDoesNotExist:
return redirect('ams:ams_detail', ams_id=ams_id)
ниже реализация форм в шаблонах:
<form method="post" action="{% url 'ams:add_project' ams.id %}" enctype="multipart/form-data">
<!-------поле которым передаем название функции для вызова текущей страницы---->
<input type="hidden" name="next" value="project_list">
Добавить проектную документацию:
<br>
{% csrf_token %}
{{ project_form.as_p }}
<br>
<input type="submit" value="Добавить">
</form>
<form method="post" action="{% url 'ams:add_project' i.id %}" enctype="multipart/form-data">
<!-------поле которым передаем название функции для вызова текущей страницы---->
<input type="hidden" name="next" value="ams_detail">
{% csrf_token %}
{{ project_form.as_p }}
<input type="submit" value="Загрузить">
<button onmousedown="showhide_changeform('add_project')" class="close_button">
<i class="fa-solid fa-xmark"></i>
</button>
</form>
Как не удивительно, но это работает. Но чувствует мое сердце что все это огромный костыль. Хотелось бы услышать предложение по способам реализации данного функционала.