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, должны быть потеряны.