реализация редиректа на нужную страницу

Помогите разобраться с проблемой. Пишу проект на джанго. Имеется модель объекты которой я могу добавлять на разных страницах. При этом я хочу чтобы функция (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>

Как не удивительно, но это работает. Но чувствует мое сердце что все это огромный костыль. Хотелось бы услышать предложение по способам реализации данного функционала.


Ответы (0 шт):