Как перенаправить на предыдущую страницу в Django после запроса POST

Я сталкиваюсь с проблемой, на которую я не могу найти решение. У меня есть кнопка в навигационной панели, которая доступна на всех страницах, и это кнопка, ответственная за создание некоторого контента.

Посмотрите, что ссылки с кнопкой:

def createadv(request):
    uw = getuw(request.user.username)
    if request.method =='POST':
    form = AdverForm(request.POST, request.FILES)
    if form.is_valid():
        form.instance.user = request.user
        form.save()
        return HttpResponseRedirect('/', {'username': request.user.username, 'uw': uw})
    args = {}
    args.update(csrf(request))
    args['username'] = request.user.username
    args['form'] = AdverForm()
    args['uw'] = uw
    return  render_to_response('createadv.html', args)

Если вы теперь видите, я всегда перенаправляюсь на главную страницу//после создания контента, но хочу вернуться к странице, с которой я начал создавать контент.

Ответ 1

Вы можете добавить next поле в свою форму и установить его на request.path. После обработки формы вы можете перенаправить на значение этого пути.

template.html

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="hidden" name="next" value="{{ request.path }}">
    <button type="submit">Let Go</button>
</form>

views.py

next = request.POST.get('next', '/')
return HttpResponseRedirect(next)

Это примерно то, что django.contrib.auth делает для формы входа, если я хорошо помню.

Если вы пройдете промежуточную страницу, вы можете передать "следующее" значение с помощью строки запроса:

some_page.html

<a href="{% url 'your_form_view' %}?next={{ request.path|urlencode }}">Go to my form!</a>

template.html

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="hidden" name="next" value="{{ request.GET.next }}">
    <button type="submit">Let Go</button>
</form>

Ответ 2

Вы можете использовать значение HTTP_REFERER:

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

Обратите внимание, что это не будет работать, если клиент отключил передачу информации о реферере (например, используя окно браузера private/incognito). В таком случае он будет перенаправлен на /.