2016-03-04 7 views
11

У меня проблема, с которой я не могу найти решение. У меня есть кнопка в навигационной панели, которая доступна на всех страницах, и это кнопка, ответственная за создание некоторого контента.Как перенаправить на предыдущую страницу в 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) 

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

ответ

19

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

template.html

<form method="POST"> 
    {% csrf_token %} 
    {{ form }} 
    <input type="hidden" name="next" value="{{ request.path }}"> 
    <button type="submit">Let's 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's Go</button> 
</form> 
3

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

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

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

+0

добавить запрос .META.get ('HTTP_REFERER', '/') в HttpResponseRedirect, но, к сожалению, это не помогло. В этом случае после отправки я остаюсь на странице «createadv». – Oleg

+0

У вас может быть дополнительная переадресация между ними. Убедитесь, что у вас есть конечная косая черта в вашем теге 'form action =" ... ", например' action = "/ createadv /" '. – Selcuk

+0

Когда вы публикуете форму, тогда ваш 'HTTP_REFERER' будет страницей, откуда вы отправили форму, которая на самом деле является той же страницей в этом случае. –