美文网首页
CBV--有关于验证的类

CBV--有关于验证的类

作者: 快去学习不然怎么去看aimer | 来源:发表于2019-09-25 19:19 被阅读0次

用户注册及登陆功能(数据来源为数据库)

注册功能

在views.py中

from django.views.generic.edit import FormView
from users.models import UsersProfile
from django.urls import reverse, reverse_lazy

from users.users_forms import (
    UserRegisterForm,UserRegisterFormView
)

#基本模版
class UserRegisterView(FormView):
    template_name = '注册界面.html'
    form_class = UserRegisterFormView  #(UserRegisterForm  方式二,只是实现方法不同)
    success_url = reverse_lazy('users:userslog')

 # 数据有效,存库
    def form_valid(self, form):
        # 方式一
        # from django.contrib.auth.hashers import make_password
        # pwd_md5 = make_password(form.cleaned_data['password'])
        # form.cleaned_data['password'] = pwd_md5
        # UsersProfile.objects.create(**form.cleaned_data)
        
        # 方式二
        user = UsersProfile(**form.cleaned_data)
        user.set_password(form.cleaned_data['password'])
        user.save()
        return super().form_valid(form)

     # 数据无效返回原来的模板,并且携带原来提交的数据
    def form_invalid(self, form):
        return super().form_invalid(form)

新建一个users_forms.py文件

#方式一,二由于继承的父类不同决定的

import re 
from django import forms

gender_choice = {
    ('1','男'),
    ('2','女'),
}

#方法二
class UserRegisterForm(forms.Form):
    
    username = forms.CharField(
        required  = True,
        widget = forms.TextInput(attrs={'class':'form-control'}),
    )
    password = forms.CharField(
        required=True,
        widget=forms.PasswordInput(attrs={'class':'form-control'}),
    )
    mobile = forms.CharField(
      min_length=11,
      max_length=11,
      required=True,
      widget=forms.TextInput(attrs={'class':'form-control'}),
    )
    age = forms.IntegerField(
        required=True,
        min_value=1,
        max_value=200,
        widget=forms.NumberInput(attrs={'class':'form-control'}),
    )
    gender = forms.ChoiceField(required=True,
    choices=gender_choice,
    widget=forms.RadioSelect(),
    initial = 1
    )
  
#单独验证需要的选项  
    def clean_mobile(self):
        mobile = self.cleaned_data['mobile']
        PRGEX_MOBILE = r'^1[358]\d{9}|^147\d{8}|^176\d{8}$'
        regex = re.compile(PRGEX_MOBILE)
        if regex.match(mobile):
            return mobile
        else:
            raise forms.ValidationError(
                '无效的手机号!',
                code='mobile_invalid'
            )


#方法一
from django import forms

from users.models import UsersProfile

class UserRegisterFormView(forms.ModelForm):
    class Meta:
        model = UsersProfile
        fields = ['username', 'password', 'mobile','age',"gender"]
        #自定义小部件,自己写的gender代替模版里的gender方法
        widgets = {
            'gender' : forms.RadioSelect()
        }

#单独验证需要的选项
    def clean_mobile(self):
        mobile = self.cleaned_data['mobile']
        PRGEX_MOBILE = r'^1[358]\d{9}|^147\d{8}|^176\d{8}$'
        regex = re.compile(PRGEX_MOBILE)
        if regex.match(mobile):
            return mobile
        else:
            raise forms.ValidationError(
                '无效的手机号!',
                code='mobile_invalid'
            )

在templates里建立注册页面

#需注意,UserRegisterFormView、注册页面、登陆页面的name必须一致
<div class="panel-body">
     <form action="{% url 'users:usersreg' %}" method="POST">
      {% csrf_token %}
       <div class="form-group">
           <label for="{{ form.username.id_for_label }}">用户名 </label>
           <inputtype="text"name="username"class="formcontrol"placeholder="UserName">
           {% if form.errors.username %}
               <div class="alert alert-danger" role="alert">{{ form.errors.username.0 }}</div>
           {%  endif  %}
       </div>
       #其他字段与上面的用户名相同      
       <div class="form-group">
            {% for radio in form.gender %}
                 <label class="radio-inline" for="{{ radio.id_for_label }}">
                     {{  radio }}    
                 </label>
            {% endfor %}
         </div>
         <button type="submit" class="btn btn-default">注册</button>
         </form>
   </div>

登陆及登出功能以及页面设置功能

在views.py

# 指定一个用于接收到 GET 请求时,需要返回的模板文件,同时验证登陆的用户信息(来源为数据库)
class UserLoginView(LoginView):
    template_name = '登陆界面.html'

class UserLogoutView(LogoutView):
    # 用户退出登录后,将要跳转的 URL
    next_page = reverse_lazy('users:usersbase')

在settings.py中

#登陆的同时将用户添加到session中,
from django.urls import reverse_lazy
# 用户登录成功后跳转的 URL
LOGIN_REDIRECT_URL = reverse_lazy("users:usersbase")

# 用户登录 GET 请求的 URL和登录验证失败后跳转到的 URL
LOGIN_URL = reverse_lazy("users:userslog")

在base.html中

{%  if not request.user.is_authenticated %}
     <li class="active"><a href="{% url 'users:userslog' %}">登陆</a></li>
     <li class="active"><a href="{% url 'users:usersreg' %}">注册</a></li>
{% endif %}

#当登陆成功时,用户被添加到session中,因此request.user.is_authenticated不为空,所以,当登陆成功时,不会出现“登陆,注册”选项

登陆验证即为不登陆状态时,有些页面不予展示

#对于FBV,在views.py中
@login_required
def users_list(request):
    pass           
#该装饰器会使用LOGIN_URL中的url作为跳转链接

#对于CBV
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy

class DiskListView(LoginRequiredMixin,View):
    login_url = reverse_lazy("users:userslog")
    def get(self, request):
        pass

#LoginRequiredMixin必须写在首位

相关文章

网友评论

      本文标题:CBV--有关于验证的类

      本文链接:https://www.haomeiwen.com/subject/lembuctx.html