web-dev-qa-db-ja.com

Django HttpResponseRedirect

基本的な連絡先フォームを作成しました。ユーザーが情報を送信すると、「ありがとう」ページにリダイレクトされます。

views.py

_def contact(request):
    # if no errors...
    return HttpResponseRedirect('/thanks/')
_

rls.py

_(r'^contact/$', contact),
(r'^contact/thanks/$', contact_thanks),
_

両方のページはハードコーディングされたURLで機能します。ただし、_/contact/_でフォームを送信すると、_/contact_(末尾のスラッシュはありません)にリダイレクトされます。

正しくリダイレ​​クトされない理由は何ですか?これを修正するにはどうすればよいですか?

PDATE:return HttpResponseRedirect('/contact/thanks/')は私が持っているものですが、問題は送信ボタン(POSTを使用)がURLにリダイレクトしないことです-まったくリダイレ​​クトしません。

16
David542

リダイレクトするのはPOSTボタンではなく、ビューです。

別に指定しない場合、フォーム(HTMLフォームタグ)は同じURLにPOSTします。フォームが/ contact /にある場合、/ contact /にPOSTします(スラッシュの有無にかかわらず同じです)。

感謝にリダイレクトする必要があるのはビューです。ドキュメントから:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

変化する /thanks/から/contact/thanks/これで完了です。

22
vad

すべての応答は正しいですが、より良いアプローチは、urls.pyでURLに名前を付け、逆の機能を持つビューでそれらにヒントを与えることです(ビューでURLをハードコーディングする代わりに)。

urls.py:

(r'^contact/$', contact, name='contact'),
(r'^contact/thanks/$', contact_thanks, name='thanks'),

そして、次のようにviews.pyでそれらをヒントします:

from Django.urls import reverse

return HttpResponseRedirect(reverse('app_name:thanks'))

これは、将来のアプローチのために優れており、 DRY Djangoの原則 に従います。

11

Aviral Dasguptaのソリューションとは別に、OPも相対URLを変更する必要があると思います。

 return HttpResponseRedirect('/thanks/')

 return HttpResponseRedirect('/contact/thanks/')

/thanks/はルートへのURLを使用する必要があります:yoursite/thanks/yoursite/contact/thanks/

5
user201788

これを試してみてください。それは私のために働いた。

return HttpResponseRedirect('thanks/')

注:-スラッシュを削除する前に

2
Jasmeet Singh

Django APPEND_SLASH 設定を使用します。

APPEND_SLASH

Trueに設定すると、リクエストURLがURLconfのパターンのいずれとも一致せず、スラッシュで終了しない場合、HTTPリダイレクトがスラッシュが追加された同じURLに発行されます。リダイレクトにより、POSTリクエストで送信されたデータが失われる可能性があります。

0
aviraldg