2015-04-09 4 views
2

У меня проблема с HttpResponseRedirect в Django. Кажется, что независимо от параметров, которые я пытаюсь сделать, он либо генерирует ошибку, либо перенаправляет ее без изменения URL-адреса. Я использую его в пользовательском представлении login_user, и я хочу, чтобы URL-адрес в адресной строке изменился после их перенаправления. Если я использую перенаправление вместо HttpResponseRedirect, он не изменяется. В любом случае, я могу заставить его использовать правильный шаблон, но URL-адрес остается прежним. Будучи новым для Django, было бы полезно, если бы кто-нибудь мог объяснить мне, как это сделать и почему мой текущий код не работает. Я видел пару подобных вопросов для моего на Stack Exchange, но ответы не помогли.HttpResponseRedirect не работает Django 1.7

Вот некоторые детали моих views.py (обратите внимание, что отступы стали странными из-за копирования и вставки здесь и не являются причиной ошибки).

from django.http import * 
from django.contrib.auth import authenticate, login, logout 

def login_user(request): 
    logout(request) 
    username = password = '' 
if request.POST: 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return HttpResponseRedirect('dashboard') 
     else: 
      state = "Your account is not active, please contact the app administrator." 
    else: 
     state = "Your username and/or password were incorrect." 
state = "Please log in below..." 
context = RequestContext(request, { 
    'state': state, 
    'username': username, 
}) 
return render_to_response('bank/auth.html', {}, context) 

dashboard - это название другого вида, и оно отлично работает в перенаправлении с моего индексного представления. Я также пытался жестко кодировать URL-адрес, но это тоже не работает. Какие-либо предложения?? Благодарю.

+0

'HttpResponseRedirect' нуждается в действительном« url »что-то вроде (например, если вы хотите перенаправить на« localhost: 8000/», вы должны вызвать' HttpResponseRedirect ('/') ', – suhailvs

ответ

5

Если вы используете HttpResponseRedirect, вы должны указать URL-адрес, а не имя URL-адреса.

Вы можете получить URL с помощью reverse:

from django.core.urlresolvers import reverse 

def my_view(request): 
    ... 
    return HttpResponseRedirect(reverse('dashboard')) 

или с помощью redirect ярлыка.

from django.shortcuts import redirect 

def my_view(request): 
    ... 
    return redirect('dashboard') 

Если использование одного из приведенных выше подходов не работает, возможно, что-то еще есть ошибка в представлении. Трудно сказать, где, так как отступ неверен. Попробуйте добавить несколько протоколов или распечаток, чтобы узнать, действительно ли вы возвращаете перенаправление, где вы думаете.

0

Я лично предпочитаю простой путь следующим образом:

В urls.py:

url(r'^dashboard/$', 'appname.views.dashboard_view', name='dashboard_view'), 

В views.py:

from django.http import HttpResponseRedirect 

def dashboard_view(request): 
    ... 
    return HttpResponseRedirect('/dashboard/') 
+0

Привет, Sibtain, URL doesn ' t в браузере, когда мы используем HttpResponseRedirect()/reverse()/simple redirect() .. что может быть проблемой? Для более подробной информации ознакомьтесь с моим вопросом: http://stackoverflow.com/questions/31085439/render- к-ответ или переадресовывать-изменения-The-шаблоны-элементы-в-Джанго-1-8 / –

1

В данном конкретном случае, проблема не имела ничего общего с моим кодом представления, на самом деле это была проблема, вызванная использованием JQuery mobile. Я нашел ответ здесь: Error with Redirects in JQuery Mobile, который должен был установить атрибут data-url на странице div. Тем не менее, я проголосовал за ответ Аласдайра, так как его путь является правильным одним из способов, которые я пытался.

Смежные вопросы