在构建Django的注册,登录/登出系统时,核心是django.contrib.auth.models.User。
在自己创建注册MTV框架后,登录、登出、修改密码等操作Django提供了现成的MV框架(需要自己创建模板)
-
注册
注册的表单可以继承django内建的django.contrib.auth.forms.UserCreationForm,该表单已经实现对两次输入的密码确认等方法
视图函数按照常见的表单提交函数的形式编写即可class UserForm(UserCreationForm): error_messages = { 'password_mismatch': '两次输入的密码不相同。', } username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}), label='用户名', help_text="只能包含字母,数字及‘@’、‘.’、‘+’、‘-’、‘_’符号") email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}), label='邮箱地址', required=False, help_text='(选填)') password1 = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control'}), label='密码', strip=False, help_text=password_validation.password_validators_help_text_html()) password2 = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control'}), label='确认密码', strip=False, help_text='请确保与上次输入的密码一致') # Meta类也继承自UserCreateForm类中的Meta类 class Meta(UserCreationForm.Meta): fields = ('username', 'email')
登录/登出等MTV框架
Django已经在django.contrib.auth.urls中提供了URLconf,为了使用该URLconf,在自己应用urls.py(或者settings目录中的urls.py中)将该URLconf包含进来
from django.conf.urls import url, include
urlpatterns = [
url(r'^', include(django.contrib.auth.urls)),
]
这样就可以使用Django内建的登录/登出框架了
需要注意的是,该内建框架只提供了M(数据模型)和V(视图函数),因此需要自己创建T(模板)
但直接使用内建的URLconf无法控制模板等的表现,因此最好还是直接使用URLconf的视图函数
-
登录
在
django.contrib.auth.urls的源码中可以看到login使用的视图函数(视图类)是LoginViewurl(r'^login/$', views.LoginView.as_view(), name='login')在
django.contrib.auth.views中是同时存在登录的视图函数(login())和视图类(LoginView);但本质上,login()函数内部直接使用了LoginView类,因此在URLconf中直接使用LoginView即可LoginView视图类中的类属性:- template_name:
LoginView视图类使用的模板名称,默认是registration/login.html - redirect_field_name:该名称保存着成功登陆后转向的网址,通过GET方法提交,默认保存在
name=next中 - authentication_form/form_class:这两个属性都可保存
LoginView视图类使用的数据模型,默认为django.contrib.auth.forms.AuthenticationForm - extra_context:额外的信息
- redirect_authenticated_user:布尔型变量,若为True,则成功登陆后的用户会转向其他页面,默认为False
如果在用户成功登陆时未提供
next变量(即转向的页面),django会转向settings.LOGIN_REDIRECT_URL页面(默认为/accounts/profile/)
上述的所有LoginView类属性都可以通过as_view()以关键字参数的形式设置url(r'^login/$', auth_views.LoginView.as_view(template_name='main/login.html', # LoginForm继承自AuthenticationForm form_class=LoginForm, redirect_authenticated_user=True), name='login') - template_name:
-
登出
在
django.contrib.auth.urls中logout使用的视图函数是LogoutViewurl(r'^logout/$', views.LogoutView.as_view(), name='logout')同login一样,
django.contrib.auth.views中同时存在视图类(logout())和视图类(LogoutView());而logout()函数本质上直接使用了LogoutView类,因此直接使用LogoutView类即可LogoutView类的类属性:- next_page:退出登录后页面的转向,在
settings.LOGOUT_REDIRECT_URL中设置 - template_name:退出登录的目标页面,默认为
/registration/logged_out.html(优先级没有next_page高) - redirect_field_name:保存用户在进行退出登录操作时提交的转向页面的名称,默认为
name=next(优先级高于next_page) - extra_context:额外信息
上述属性均可以在
LogoutView的as_view()中以关键字参数的形式进行重新设置 - next_page:退出登录后页面的转向,在
-
修改密码
在
django.contrib.auth.urls中通过PasswordChangeView视图类来进行密码的修改PasswordChangeView类的类属性:- template_name:修改密码时使用的模板,默认为
registration/password_change_form.html - success_url:密码成功修改后转向的页面,默认为
password_change_done视图 - form_class:修改密码使用的数据模型,默认为
PasswordChangeForm(该模型必须含有user关键字)
未登录用户加载
password_change页面时,会自动跳转到登录页面(由settings.LOGIN_URL设置)(因为PasswordChangeView类中的方法由login_required装饰) - template_name:修改密码时使用的模板,默认为
-
成功修改密码
PasswordChangeDoneView
PasswordResetView等
待续。。。