1.概述Django中的django.contrib.auth应用程序提供了完整的用户和身份验证和授权功能。Django官方推荐基于内置的User数据模型新建自定义用户模型,方便添加新的用户字段和生日等功能。本文内容为:介绍如何在Django中自定义用户模型,并集成到系统中。自定义django.contrib.auth应用程序使用的模板文件。在系统中集成认证和授权功能。以下所有示例均在Python3.8.2+Django2.1中实现。2.自定义用户模型2.1。创建单独的与认证和授权帐户相关的应用程序$pythonmanage.pystartappaccounts将应用程序添加到项目中:#project_dir/settings.pyINSTALLED_APPS=[#Local'accounts.apps.AccountsConfig',#...]2.2.创建自定义用户模型CustomUserDjango官方文档推荐基于AbstractBaseUser创建自定义用户模型,但一般基于AbstractUser创建更方便。新字段birthday添加到此命中的自定义CustomUser。#accounts/models.pyfromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportAbstractUserclassCustomUser(AbstractUser):birthday=models.DateField(null=True,blank=True)2.3。集成自定义用户模型,通过AUTH_USER_MODEL告诉系统新建用户模型:#project_dir/settings.pyAUTH_USER_MODEL='accounts.CustomUser'之后,可以通过get_user_model()获取自定义用户模型:#在django的视图或模型文件中。contrib.authimportget_user_modelCustomUser=get_user_model()django.contrib.auth应用实现了完整的登录和注销功能,在django.contrib中定义了login、logout、password_change、password_change_done、password_reset、password_reset_done、password_reset_confirm、password_reset_complete等URL.auth.urls。将django.contrib.auth.urls集成到项目中:..]集成后可以访问/accounts/login/,/accounts/logout/,/accounts/password_change/等功能,也可以同时在views和templates中访问这个URL定义:LoginURL#inviewfilesfromdjango.urlsimportreverse,reverse_lazylogin_url=reverse('login')#inClassBasedView:login_url=reverse_lazy('login')2.4.将自定义用户模型集成到后台管理界面中,在后台管理界面中,添加新用户时呈现的表单由django.contrib.auth.forms.UserCreationForm提供,更新用户时显示的表单由django提供。由contrib.auth.forms.UserChangeForm提供。为自定义用户模型自定义这两种形式:#accounts/forms.pyfromdjango.contrib.auth.formsimportUserCreationForm,UserChangeFormfrom.modelsimportCustomUserclassCustomUserCreationForm(UserCreationForm):classMeta(UserCreationForm.Meta):model=CustomUserfields=('username','email','birthday',)classCustomUserChangeForm(UserChangeForm):classMeta(UserChangeForm.Meta):model=CustomUserfields=UserChangeForm.Meta.fields+('birthday',)在管理员中注册:#accounts/admin.pyfromdjango.contribimportadminfromdjango.contrib.auth.adminimportUserAdminfrom.modelsimportCustomUserfrom.formsimportCustomUserCreationForm,CustomUserChangeFormclassCustomUserAdmin(UserAdmin):model=CustomUseradddis_form=CustomUserFormCustomUserForm=UserCreationFormform'[,'用户名','生日','is_staff']admin.site.register(CustomUser,CustomUserAdmin)3。自定义django.contrib.auth应用程序3.1使用的模板文件。定义模板文件django.contrib.auth中的login、logout、password_change、password_change_done、password_reset、password_reset_done、password_reset_confirm、password_reset_complete等视图,需要访问的对应模板保存在registration/目录下,模板文件包括:login.html、password_change_done.html、password_change_form.html、Password_reset_complete.html、password_reset_confirm.html、password_reset_done.html、password_reset_form.html等默认配置,模板文件需要保存在/templates//registration/目录,例如accounts/templates/accounts/registration/login.html。对于小项目,你可以将模板目录设置为扁平的:BASE_DIR,'templates')],#new#...}]这样模板就可以保存在templates/目录下,比如templates/registration/login.html。模板中可以使用表单变量,例如:{%extends'base.html'%}{%blocktitle%}Login{%endblocktitle%}{%块内容%登录
{%csrf_token%}{{form.as_p}}登录{%endblockcontent%}3.2。创建注册函数django.contrib.auth没有实现注册函数。创建基于CreateView的SignUpView视图:#accounts/views.pyfromdjango.views.generic.editimportCreateViewfromdjango.urlsimportreverse_lazyfrom.modelsimportCustomUserfrom.formsimportCustomUserCreationFormclassSignupView(CreateView):#model=CustomUserform_class=CustomUserCreationFormname'。html'success_url=reverse_lazy('login')添加模板文件:{%extends'base.html'%}{%loadcrispy_forms_tags%}{%blocktitle%}Signup{%endblocktitle%}{%blockcontent%Signup
{%csrf_token%}{{form|crispy}}Signup{%endblockcontent%}添加应用程序级URL配置:#accounts/urls.pyfromdjango.urlsimportpathfrom.viewsimportSignUpViewurlpatterns=[path('signup/',SignUpView.as_view(),name='signup'),]集成到项目级URL配置中:#project_dir/urls.pyurlpatterns=[path('admin/',admin.site.urls),path('accounts/',include('accounts.urls')),path('accounts/',include('django.contrib.auth.urls')),#...]4、在系统中集成认证和授权功能4.1.身份验证:需要登录才能访问视图。LoginRequiredMixin应该继承和添加。属性值login_url设置为登录页面地址或无登录时重定向的URL名称:#inviewfilesfromdjango.views.generic.editimportDeleteViewfromdjango.urlsimportreverse_lazyfromdjango.contrib.auth.mixinsimportLoginRequiredMixinfromdjango.core.exceptionsimportPermissionDeniedfrom.modelsimportArticleclassArticleDeleteView(LoginRequiredMixin,DeleteView):model=Articletemplate_name='article_delete.html'成功_url=reverse_lazy('article_list')login_url='登录'4.2。授权:只有特定的用户或权限才能访问CBV。代码调用入口为dispatch()方法,可以在该方法中实现权限校验。权限不够时抛出Exception:#inviewfilesfromdjango.views.generic.editimportDeleteViewfromdjango.urlsimportreverse_lazyfromdjango.contrib.auth.mixinsimportLoginRequiredMixinfromdjango.core.exceptionsimportPermissionDeniedfrom.modelsimportArticleclassArticleDeleteView(LoginRequiredMixin,DeleteView):model=Articletemplate_name='article_delete.html'success_url=reverse_lazy('article_list')login_url='login'defdispatch(self,request,*args,**kwargs):obj=自我。get_object()ifobj.author!=request.user:raisePermissionDenied()returnsuper().dispatch(request,*args,**kwargs)资源Djangoforbeginners