基本的な連絡先フォームを作成しました。ユーザーが情報を送信すると、「ありがとう」ページにリダイレクトされます。
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にリダイレクトしないことです-まったくリダイレクトしません。
リダイレクトするのは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/
これで完了です。
すべての応答は正しいですが、より良いアプローチは、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の原則 に従います。
Aviral Dasguptaのソリューションとは別に、OPも相対URLを変更する必要があると思います。
return HttpResponseRedirect('/thanks/')
に
return HttpResponseRedirect('/contact/thanks/')
/thanks/
はルートへのURLを使用する必要があります:yoursite/thanks/
とyoursite/contact/thanks/
。
これを試してみてください。それは私のために働いた。
return HttpResponseRedirect('thanks/')
注:-スラッシュを削除する前に
Django APPEND_SLASH 設定を使用します。
Trueに設定すると、リクエストURLがURLconfのパターンのいずれとも一致せず、スラッシュで終了しない場合、HTTPリダイレクトがスラッシュが追加された同じURLに発行されます。リダイレクトにより、POSTリクエストで送信されたデータが失われる可能性があります。