Джанго HttpResponseRedirect - PullRequest
       9

Джанго HttpResponseRedirect

15 голосов
/ 28 апреля 2011

Я создал базовую контактную форму, и когда пользователь отправляет информацию, он должен перенаправить на страницу «Спасибо».

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 - она ​​вообще не перенаправляет.

Ответы [ 5 ]

21 голосов
/ 29 апреля 2011

Это не кнопка 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/ и все готово.

11 голосов
/ 28 июля 2015

Все ответы верны, но лучший подход - дать имена вашим 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'))

Это лучше для будущего подхода иследуйте СУХОМУ принципу Джанго .

5 голосов
/ 28 апреля 2011

Я считаю, что кроме решения Aviral Dasgupta, OP также необходимо изменить относительный URL.

 return HttpResponseRedirect('/thanks/')

до

 return HttpResponseRedirect('/contact/thanks/')

/thanks/ должен получить URL-адрес root: yoursite/thanks/, а не yoursite/contact/thanks/.

2 голосов
/ 09 октября 2015

Просто попробуйте это. У меня это сработало.

return HttpResponseRedirect('thanks/')

Примечание: - Снять косую черту перед

0 голосов
/ 28 апреля 2011

Используйте настройку Django APPEND_SLASH .

APPEND_SLASH

При значении True, если URL-адрес запроса не соответствует ни одному из шаблонов в URLconf, и это не заканчивается косая черта, HTTP перенаправление выдается тот же URL с добавленной косой чертой. Обратите внимание, что перенаправление может вызвать любой данные, представленные в запросе POST, должны быть потерял.

...