Django中的多个身份验证登录页面

时间:2020-01-17 11:38:11

标签: django

我在一个Django项目中有多个应用程序

/user
/manager
/business`

每个人都需要单独的一组登录和注册。如何使用django.contrib.auth满足此要求?

我主要使用urlpatterns

urlpatterns = [
    path('admin/',    admin.site.urls),
    path('user/',     include('user.urls')),
    path('user/',     include('django.contrib.auth.urls')),
    path('manager/',  include('manager.urls')),
    path('manager/',  include('django.contrib.auth.urls')),
    path('business/', include('business.urls')),
    path('business/', include('django.contrib.auth.urls')),

应用程序中的网址模式如下:

urlpatterns = [
    path('index', views.index, name='index'),
    path('register', views.register, name='register'),
]

我对loginregister的看法不同,每个应用程序中的模板也不同:/templates/register/register.html/templates/register/login.html

但是,登录和注册视图似乎在应用程序之间共享。有没有一种方法可以轻松地将它们分开?

1 个答案:

答案 0 :(得分:0)

首先,我建议您在URL中使用namespaces,以免与URL中的名称产生任何冲突。因此,将app_name添加到您应用的urls.py中,例如

#user urls.py

app_name='user'
urlpatterns = [
    ...

然后,类似{% url 'user:register' %}的内容将指向您的用户应用程序的注册视图,{% url 'manager:register' %}的内容将指向您的经理应用程序的注册视图,依此类推。

如果您已为每个应用程序定义了单独的登录视图,则只要您已在应用程序urls.py中导入了正确的视图,这些视图也是如此。

由于您还在每个应用程序中都包含django.contrib.auth.urls,因此当然还有第二个“登录/”路径来自auth.urls中的默认路径。但是,据我所知,URL的解析是由django自上而下完成的,因此,如果您按照帖子中的顺序保留URL的顺序,则将首先点击并使用自定义'login /'。所以没问题。

我发现您的模板有问题。如果我理解正确,它们都位于您应用程序中的templates/register/文件夹中。 django模板加载器不会区分用户应用程序中的register.html模板和管理器应用程序中的register.html模板。因此,很可能您没有获得正确的模板。我建议将模板移至应用程序特定的子文件夹,例如/templates/user/register。然后,您可以在视图中获取正确的模板(例如'user / register.html')。

我了解到您有特定于应用程序的视图。当然,您总是可以继承django提供的视图,并使其适应您的需求。例如,通过覆盖form_valid()的{​​{1}}方法。 This这样的帖子提供了一个示例。

另一方面,如果您只想将默认的django登录视图与自定义模板一起使用,则可以将该模板作为kwarg传递给视图。例如:

LoginView

如果您要在成功登录后重定向到某个自定义站点,则可以在登录表单中添加一个名为“ next”的输入,其中包含要重定向到的网址,例如

# user urls.py

from django.urls import path
from django.contrib.auth.views import LoginView

app_name='user'
urlpatterns = [
    path('login/', LoginView.as_view(template_name='user/login.html'), name='login'),
    # more patterns
]

在您的应用中,您可能会使用user_passes_test装饰器或类似工具来检查是否允许用户访问该应用中的视图。