2

我的登錄網址是Django的顯示驗證的登錄頁面時,已經登錄

url(r'^login/$', 'django.contrib.auth.views.login', 
    {'template_name': 'login.html', 
    'extra_context': {'next': '/tasks/home/', 
         'title': 'Taskman | Log In'}, 

它確實成功登錄,但是當我鍵入「/用戶/密碼」再次作爲URL,它再次顯示登錄頁面成功登錄後。

那麼Django不處理這種情況?

由於login意見顯示

def login(request, template_name='registration/login.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      authentication_form=AuthenticationForm, 
      current_app=None, extra_context=None): 
    """ 
    Displays the login form and handles the login action. 
    """ 
    redirect_to = request.REQUEST.get(redirect_field_name, '') 

    if request.method == "POST": 
     form = authentication_form(request, data=request.POST) 
     if form.is_valid(): 

      # Ensure the user-originating redirection url is safe. 
      if not is_safe_url(url=redirect_to, host=request.get_host()): 
       redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL) 

      # Okay, security check complete. Log the user in. 
      auth_login(request, form.get_user()) 

      return HttpResponseRedirect(redirect_to) 
    else: 
     form = authentication_form(request) 

    current_site = get_current_site(request) 

    context = { 
     'form': form, 
     redirect_field_name: redirect_to, 
     'site': current_site, 
     'site_name': current_site.name, 
    } 
    if extra_context is not None: 
     context.update(extra_context) 
    return TemplateResponse(request, template_name, context, 
          current_app=current_app) 

所以我一定要覆蓋AuthenticationForm

回答

1

這是我一直在用Django看到的行爲 - 即使您已經登錄,並且您嘗試導航到登錄頁面,它將顯示登錄頁面。在某些情況下,這是有用的行爲,例如,如果某個人擁有多個可登錄的用戶帳戶,則表示他們可以登錄到不同的用戶帳戶,而無需先登出。

如果要重寫此行爲,可以由具有登錄URL指向一個RedirectView是做到這一點:

  • 如果用戶已經登錄,它們重定向到一個特定的頁面(理想,如果URL中提供了下一個頁面參數,則會將它指向該頁面)。
  • 如果用戶未登錄,則將其重定向到實際的登錄提示視圖。

希望這會有所幫助。

+0

通過指定我自己的視圖,我無法使用默認身份驗證系統。如果我沒有錯? – user2950086

+0

是的,您仍然可以使用標準身份驗證系統沒有問題,我所建議的是您公開給用戶的登錄URL可以指向您自己的自定義視圖,如果用戶是用戶,它將用戶重定向到默認身份驗證系統登錄視圖沒有登錄。 – robjohncox

+0

現在我的觀點看起來像這樣的東西, – user2950086