最近跟着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中應該這樣解決:
1 #首先導入: 2 3 from django.contrib.auth.views import LoginView 4 5 #然后,路由這樣寫: 6 urlpatterns = [ 7 path('login/', LoginView.as_view(), name='login'), 8 ]
這樣問題得到了解決!
教訓:我純粹是業余愛好,又喜歡新的東西,所以,不怕踩坑!如果要講效率,還是要和書上的環境一致才好!
27日增加:
今天又研究了一天,終於把這個用戶認證這一塊搞明白了!實際上用戶認證主一塊Django已經給我們准備好了!Djnago3中只用把相關的路由文件導入就可以用了!
你打開這個Django.contrib.auth.urls一看就全明白了。
只需要在你的應用的路由文件中加入一行:
path('', include('Django.contrib.auth.urls'))
這個文件里沒別的東西,就是幾條路由!
1 # The views used below are normally mapped in django.contrib.admin.urls.py 2 # This URLs file is used to provide a reliable view deployment for test purposes. 3 # It is also provided as a convenience to those who want to deploy these URLs 4 # elsewhere. 5 6 from django.contrib.auth import views 7 from django.urls import path 8 9 urlpatterns = [ 10 path('login/', views.LoginView.as_view(), name='login'), 11 path('logout/', views.LogoutView.as_view(), name='logout'), 12 13 path('password_change/', views.PasswordChangeView.as_view(), name='password_change'), 14 path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'), 15 16 path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'), 17 path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'), 18 path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), 19 path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), 20 ]