2012-11-01 27 views
27

Tôi đang sử dụng Django được xây dựng theo quan điểm cho người dùng đăng nhập:Tại sao đăng nhập người dùng thứ hai chuyển hướng tôi đến/accounts/profile/url?

url(r'^user/login/$', 'django.contrib.auth.views.login', {'template_name': 'users/templates/login.html'}, name='user-login'), 

Sau khi đăng nhập khi tôi goto user/đăng nhập một lần nữa tôi có thể đăng nhập lần thứ hai. Tôi gửi biểu mẫu và nhận được:

URL hiện tại, tài khoản/hồ sơ /, không khớp với bất kỳ thông tin nào trong số này.

Tôi chưa khai báo url này trong urls.py.

Tôi đang làm gì sai? Tại sao khung công tác muốn chuyển hướng đến url này?

Trả lời

61

django.contrib.auth.views.login chuyển hướng bạn đến accounts/profile/ ngay sau khi bạn đăng nhập.
Bạn có thể muốn thiết LOGIN_REDIRECT_URL bên trong tập tin settings.py của bạn để bất cứ điều gì bạn thích ..

+5

Điều này là chính xác, mặc dù nó lạ được mã hóa để chuyển hướng đến nơi không tồn tại. Chắc chắn chuyển hướng đến '/' sẽ là một mặc định hợp lý hơn? –

+0

Làm việc tuyệt vời. Thêm văn bản "LOGIN_REDIRECT_URL = ('..')" vào settings.py làm việc cho tôi để chuyển hướng người dùng trở lại trang chính mặc định. – Praxiteles

+0

đã lưu ngày của tôi :) – Humoyun

6

Explained in doc:

(tài khoản/profile/là ...) URL nơi yêu cầu được chuyển hướng sau khi đăng nhập khi xem contrib.auth.login được không có tham số tiếp theo.

Vì bạn chưa xác thực yêu cầu của bạn được chuyển hướng đến url này. Để tránh chuyển hướng, bạn nên đăng xuất người dùng trước khi gửi đến user/login, tạo chế độ xem đăng nhập tùy chỉnh hoặc append Next parameter.

1

kiểm tra login.html bạn

<form method="post" action="."> 
    ~blah~ 
    <input type="hidden" name="next" value="/"><!-- login.html must send "next" parameter, and "next" parameter value is url that you want to redirect. --> 
    ~blah~ 
</form> 

tốt luck ~

1

Tất cả điều này không hiệu quả đối với tôi. Tôi sử dụng một giải pháp JavaScript:

Trong login.html (nơi các nút đăng nhập xã hội là) tôi đặt kịch bản này mà các cửa hàng tiếp theo trong lưu trữ địa phương ::

<script> 
// Check for local storage 
if (typeof(Storage) !== "undefined") { 
    var h = window.location.href; 
    if (h.indexOf("next") > 0){ 
     var tokens = h.split("="); 
     var nextUrl = tokens[1]; 

     for(i = 2;i< tokens.length;i++){ 
      nextUrl += ("=" + tokens[i]); 
     } 
     localStorage.setItem("next",nextUrl); 

    } 
} 
</script> 

Trong trang mà người sử dụng đang được chuyển hướng đến tôi đã sử dụng kịch bản sau đây để chuyển hướng:

$(document).ready(function() { 

    // Check for local storage 
    if (typeof(Storage) !== "undefined") { 
      var nextUrl = localStorage.getItem("next"); 
      if (nextUrl.length > 0){ 
       localStorage.setItem("next",""); 
       window.location = nextUrl; 
      } 
    } 
    else { 
     // Sorry! No web storage support.. 
    } 
} 
3

@CpS cung cấp giải pháp rất tốt, tôi chỉ muốn nâng cao nó một chút:

Ví dụ, bạn có fo llowing url:

urlpatterns = [ 
    # django's login/logout 
    url(r'login/$', 'django.contrib.auth.views.login', name='login'), 
    url(r'logout/$', 'django.contrib.auth.views.logout', name='logout'), 
    url(r'logout-then-login/$', 'django.contrib.auth.views.logout_then_login', name='logout_then_login'), 
    url(r'^$', views.dashboard, name='dashboard') 
] 

dashboard.html là nơi bạn muốn chuyển hướng sau khi đăng nhập thành công, sau đó bạn có thể sửa đổi tập tin settings.py bạn cho phù hợp:

from django.core.urlresolvers import reverse_lazy 

LOGIN_REDIRECT_URL=reverse_lazy('dashboard') 
LOGIN_URL=reverse_lazy('login') 
LOGOUT_URL=reverse_lazy('logout') 

Chúng tôi đang sử dụng reverse_lazy() để xây dựng các URL động. Chức năng reverse_lazy() đảo ngược các URL giống như reverse(), nhưng bạn có thể sử dụng nó khi cần đảo ngược URL trước khi tải cấu hình URL của dự án.

Các vấn đề liên quan