web-dev-qa-db-ja.com

Django after POST requestで前のページにリダイレクトする方法

私は解決策を見つけることができない問題に直面しています。すべてのページで利用できるnavbarのボタンがあり、それはコンテンツの作成を担当するボタンです。

ボタンでリンクを表示します:

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)

ご覧のように、コンテンツを作成した後は常にメインページ「/」にリダイレクトしますが、コンテンツの作成を開始したページに戻りたいと思います。

26
Oleg

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>
45
Antoine Pinsard

HTTP_REFERER値を使用できます:

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

クライアントがリファラー情報の送信を無効にしている場合(プライベート/シークレットブラウザウィンドウの使用など)、これは機能しないことに注意してください。このような場合、/にリダイレクトされます。

18
Selcuk