2015-04-10 5 views
0

Я не могу перенаправить страницу после входа в систему. Я использую django 1.7.django логин не требуется

#settings.py 
# login URL 
LOGIN_URL = '/login/' 

#urls.py 
url(r'^home/order',views.buy_order,name="buy_order"), 
url(r'^login/$',views.login,name='login'), 
url(r'^login_submit/$',views.login_submit,name='login_submit'), 

#views.py 
@login_required(login_url='/login/') 
def buy_order_confirm(request): 
    pass 

def login(request): 
    template='login.html' 
    return render(request,template) 

def login_submit(request): 
    if request.method == "POST": 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login_user(request, user) 
       return HttpResponseRedirect(request.POST['next']) # gives error : *** MultiValueDictKeyError: "'next'" 
      else: 
       raise Http404("User is not active") 
    else: 
     raise Http404("Not a valid request") 
    return render(request,template) 

В doc указано, что после страницы входа он будет перенаправлен автоматически. Но это не для меня. Я прочитал this и this. Они говорят, чтобы отправить параметры get в скрытое поле в форме. Я не чувствую, что это правильно. Я чувствую, что должен быть ясный путь.

Может ли кто-нибудь сказать мне, где я ошибаюсь?

ответ

1

Я не понимаю. ваше состояние находится в режиме POST

if request.method == "POST"

А вы попробуйте перенаправить с GET аргумент ...

Вам необходимо пройти «рядом» значение в вашей форме, и получить его с POST [ «следующий»]

Пример:

if 'next' in request.POST: 
    return HttpResponseRedirect(request.POST['next']) 
else: 
    return HttpResponseRedirect('/home/') 
+0

привет, извините, что это моя ошибка. для 'request.POST ['next']', я получаю такую ​​же '*** MultiValueDictKeyError:" 'next' ''error. Следующее значение видно только из 'request.META ['HTTP_REFERER']' as ''http: // localhost: 8000/login /? Next =/home/order'' – Netro

+0

Спасибо, мне нужно добавить скрытое поле формы для следующего параметра , Он решает проблему. Но мне это не показалось в doc 'https: // docs.djangoproject.com/en/1.7/topics/auth/default/# django.contrib.auth.decorators.login_required'. – Netro

0

Решенный, добавив скрытое поле для next param.login.html является

form class="form-signin" method="post" action="{% url 'login' %}">{% csrf_token %} 
     <input type="hidden" name="next" value="{{ next }}" /> 
     <h2 class="form-signin-heading">Please sign in</h2> 
     <label for="inputEmail" class="sr-only">Email address</label> 
     <input type="text" id="inputEmail" class="form-control" placeholder="Username" required="" autofocus="" name="username"> 
     <label for="inputPassword" class="sr-only">Password</label> 
     <input type="password" id="inputPassword" class="form-control" placeholder="Password" required="" name="password"> 
     <div class="checkbox"> 
      <label> 
       <input type="checkbox" value="remember-me"> Remember me 
      </label> 
     </div> 
     <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> 
    </form> 

И мой взгляд Войти является,

def login(request): 
    if request.method == 'GET': 
     template='login.html' 
     context = {} 
     next = request.GET.get('next',None) 
     if next: 
      context['next'] = next 
     return render(request,template,context) 
    if request.method == "POST": 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login_user(request, user) 
       template='home.html' 
       return HttpResponseRedirect(request.POST['next']) 
      else: 
       raise Http404("User is not active") 

Проблема решается с помощью скрытого поля. но мне не ясно с doc

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