在构建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使用的视图函数(视图类)是LoginView
url(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使用的视图函数是LogoutView
url(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等
待续。。。