最近跟着Django by Example 2015学习,可老想用最新版的Django3。在学的过程中可踩了不少坑。
今天就又碰到一个:
在这本书中96页有这样的代码:
url(r'^login/$', 'django.contrib.auth.views.login', name='login'),
第一个坑:url被path替代。
第二个坑:上面的第二个参数已经不能用' xxx'这样的格式。我从
django.contrib.auth中导入login,将上面的语句改为:
path('login/', login, name='login')(因为,django.contrib.auth.views.login中已经没有login了),
但服务器启动没事,一用到这个路由,就报错。好像是login函数获得的参数不对。
查了一个晚上,终于找到了原因所在。那个参数位置应该是一个视图函数的位置,而我们引入的
只不过是一个login登录函数。这个登录函数自然需要一个user参数了。这就是为什么报错缺少参数的原因了。
在django3中应该这样解决:
#首先导入: from django.contrib.auth.views import LoginView #然后,路由这样写:
urlpatterns = [
path('login/', LoginView.as_view(), name='login'),
]
这样问题得到了解决!
教训:我纯粹是业余爱好,又喜欢新的东西,所以,不怕踩坑!如果要讲效率,还是要和书上的环境一致才好!
27日增加:
今天又研究了一天,终于把这个用户认证这一块搞明白了!实际上用户认证主一块Django已经给我们准备好了!Djnago3中只用把相关的路由文件导入就可以用了!
你打开这个Django.contrib.auth.urls一看就全明白了。
只需要在你的应用的路由文件中加入一行:
path('', include('Django.contrib.auth.urls'))
这个文件里没别的东西,就是几条路由!
# The views used below are normally mapped in django.contrib.admin.urls.py
# This URLs file is used to provide a reliable view deployment for test purposes.
# It is also provided as a convenience to those who want to deploy these URLs
# elsewhere. from django.contrib.auth import views
from django.urls import path urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'), path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'), path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]