我在一个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'),
]
我对login
和register
的看法不同,每个应用程序中的模板也不同:/templates/register/register.html
和/templates/register/login.html
但是,登录和注册视图似乎在应用程序之间共享。有没有一种方法可以轻松地将它们分开?
答案 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装饰器或类似工具来检查是否允许用户访问该应用中的视图。