如何从 django 的视图中传递自定义身份验证表单?

How to pass a custom authentication form from within a view in django?

我正在尝试将我创建的自定义身份验证表单传递给 auth.views.login。

我找到的所有教程都是通过 urls.py 中的 url() 完成的,并使用 url 登录视图,例如:

url(r'^login/$', auth.views.login,{'authentication_form':MyAuthenticationForm})

但是我希望url与索引url相同,如果用户通过身份验证则显示索引否则显示登录使用我的自定义身份验证表单。

这是我的 views.py :

from django.shortcuts import render
from django.contrib.auth import views as auth_views


def cp(request):
  if request.user.is_authenticated():
      return render(request, 'index.html')

  # How to pass my custom authentication form ?
  return auth_views.login(request)

这是有效的,但我如何告诉 django 我的自定义身份验证表单?

我建议您保留 /login/ 作为登录名 url,但对索引视图使用 login_required 装饰器。当新用户访问您的索引 url 时,他们将被重定向到您的登录页面,然后在他们登录后返回到索引 url。

from django.contrib.auth.decorators import login_required

@login_required
def index(request):
   return render(request, 'index.html')

这种方式在Django中非常典型,比处理索引url的登录更简单。如果您真的想从索引页面调用登录视图,那么您应该使用与 url 模式中相同的 kwarg authentication_form

return auth_views.login(request, authentication_form=MyAuthenticationForm)