用户登录系统

在构建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')
    
  • 登出

    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:额外信息

    上述属性均可以在LogoutViewas_view()中以关键字参数的形式进行重新设置


  • 修改密码

    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装饰)

  • 成功修改密码

    PasswordChangeDoneView


PasswordResetView等

待续。。。

你可能感兴趣的:(用户登录系统)