Django在已登录时显示身份验证登录页面

时间:2014-05-20 05:57:09

标签: python django django-forms django-views django-authentication

我的登录网址是

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

并且登录成功,但当我再次输入“/ user / login”作为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 个答案:

答案 0 :(得分:1)

这是我一直看到的Django行为 - 即使您已登录,并且您尝试导航到登录页面,它将显示登录页面。在某些情况下这是有用的行为,例如,如果一个人有多个可以登录的用户帐户,这意味着他们可以登录到其他用户帐户而无需先退出。

如果您希望覆盖此行为,可以通过将登录网址指向RedirectView来执行此操作:

  • 如果用户已登录,请将其重定向到特定页面(理想情况下,如果URL中提供了下一页参数,则会将其指向该页面。)
  • 如果用户未登录,请将其重定向到实际的登录提示视图。

希望这有帮助。