Django HttpResponseRedirect
Я создал базовую контактную форму, и когда пользователь отправляет информацию, он должен перенаправить на страницу "Спасибо".
views.py:
def contact(request):
# if no errors...
return HttpResponseRedirect('/thanks/')
urls.py:
(r'^contact/$', contact),
(r'^contact/thanks/$', contact_thanks),
Обе страницы работают по жестко закодированному URL. Однако, когда я отправляю форму на /contact/
она перенаправляет на /contact
(без косой черты), которая является несуществующей страницей (404 или страница с сообщением об ошибке, сообщающая, что мне нужна косая черта).
В чем причина неправильного перенаправления, и как я могу это исправить?
ОБНОВЛЕНИЕ: return HttpResponseRedirect('/contact/thanks/')
- это то, что у меня сейчас есть, но проблема в том, что кнопка отправки (использующая POST) не перенаправляет на URL - она вообще не перенаправляет.
Ответы
Ответ 1
Это не кнопка POST, которая должна перенаправлять, а вид.
Если не указано иное, форма (тег HTML-формы) отправляет один и тот же URL. Если форма находится на /contact/, она отправляет на /contact/(с косой чертой или без нее, то же самое).
Это с учетом того, что вы должны перенаправить на спасибо. Из документа:
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/
и все готово.
Ответ 2
Все ответы верны, но лучший подход - дать имена вашим URL-адресам в urls.py
и подсказку им в представлениях с обратной функцией (вместо жесткого кодирования 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 Джанго.
Ответ 3
Я считаю, что кроме решения Aviral Dasgupta OP также необходимо изменить относительный url.
return HttpResponseRedirect('/thanks/')
to
return HttpResponseRedirect('/contact/thanks/')
/thanks/
должен взять url для root: yoursite/thanks/
, а не yoursite/contact/thanks/
.
Ответ 4
Просто попробуйте это. Это сработало для меня.
return HttpResponseRedirect('thanks/')
Примечание: - Удалите переднюю косую черту перед
Ответ 5
Используйте настройку Django APPEND_SLASH.
APPEND_SLASH
Если установлено значение Истина, если URL-адрес запроса не соответствует ни одному из шаблонов в URLconf, и это не заканчивается slash, перенаправление HTTP выдается тот же URL-адрес с добавлением косой черты. Обратите внимание, что перенаправление может вызвать данные, представленные в запросе POST, должны быть потеряны.