前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-信息资讯-Form 表单注册

Django实战-信息资讯-Form 表单注册

作者头像
小团子
发布2019-07-18 16:34:08
4580
发布2019-07-18 16:34:08
举报
文章被收录于专栏:数据云团数据云团

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

本次注册涉及到使用短信验证码和图形验证码,所以在进行注册表单验证时,不仅有用户名、密码和手机号,还需要对前端传过来的验证码进行比对验证。

同样,在注册表单中,也继承了表单验证错误消息提示 Mixin 类。

① 表单验证错误消息提示

Mixin 类,实现多继承;使用Mixin类实现多重继承要非常小心。

  • 首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等。
  • 其次它必须责任单一,如果有多个功能,那就写多个Mixin类。然后,它不依赖于子类的实现。
  • 最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。
代码语言:javascript
复制
class FormMixin(object):
    def get_error(self):
        # 映射
        if hasattr(self, 'errors'):
            errors = self.errors.get_json_data()
            # 随机抽取
            error_tuple = errors.popitem()
            error_list = error_tuple[1]
            error_dict = error_list[0]
            message = error_dict['message']
            return message
        else:
            return None

② 注册表单

代码语言:javascript
复制
    telephone = forms.CharField(max_length=11, min_length=11, error_messages={
        "required": "必须输入手机号码!", "min_length": "手机号码个数必须是11位!", "max_length": "手机号码个数必须是11位!"})
    username = forms.CharField(max_length=20, min_length=3, error_messages={"required": "必须输入用户名!", 'min_length': "用户名最少不能少于3个字符", "max_length": "用户名最多不能超过20个字符!"})
    img_captcha = forms.CharField(max_length=4, min_length=4, error_messages={"required": "请输入图形验证码"})
    password1 = forms.CharField(min_length=6, max_length=20, error_messages={"required": "必须输入密码!", "min_length": "密码最少不能少于6位!", "max_length": "密码最多不能超过20位!"})
    password2 = forms.CharField(min_length=6, max_length=20, error_messages={"required": "请重新输入密码!", "min_length": "密码最少不能少于6位!", "max_length": "密码最多不能超过20位!"})
    sms_captcha = forms.CharField(max_length=4, min_length=4, error_messages={"required": "请输入短信验证码"})

Form表单的功能

  1. 自动生成HTML表单元素
  2. 检查表单数据的合法性
  3. 如果验证错误,重新显示表单(数据不会重置)
  4. 数据类型转换(字符类型的数据转换成相应的Python类型)

处理表单数据

表单数据都被存储在form.cleaned_data对象中(字典类型,意为经过清洗的数据),而且数据会被自动转换为Python对象。

重写 clean 方法 is_valid

代码语言:javascript
复制
    def validate_data(self, request):
        cleaned_data = self.cleaned_data
        password1 = cleaned_data.get('password1')
        password2 = cleaned_data.get('password2')

        if password1 != password2:
            return self.add_error("password1", "两次密码输入不一致!")

        img_captcha = cleaned_data.get('img_captcha')
        server_img_captcha = request.session.get('img_captcha')
        if img_captcha.lower() != server_img_captcha.lower():
            return self.add_error('img_captcha', "图形验证码错误!")

        sms_captcha = cleaned_data.get('sms_captcha')
        server_sms_captcha = request.session.get('sms_captcha')
        if sms_captcha.lower() != server_sms_captcha.lower():
            return self.add_error('sms_captcha', '短信验证码错误!')
        # 验证用户是否存在
        telephone = cleaned_data.get('telephone')
        exists = User.objects.filter(telephone=telephone).exists()
        if exists:
            return self.add_error('telephone', '该手机号码已经存在!')
        return True

③ 注册视图

在重构 USER 模型中,User 模型自定义管理器,创建普通用户。

代码语言:javascript
复制
user = User.objects.create_user(telephone=telephone, username=username, password=password)
login(request, user)

Django—form组件 is_valid 校验机制

代码语言:javascript
复制
if form.is_valid() and form.validate_data(request):
代码语言:javascript
复制
class RegisterView(View):
    def get(self, request):
        return render(request, 'auth/register.html')
    def post(self, request):
        form = RegisterForm(request.POST)
        if form.is_valid() and form.validate_data(request):
            telephone = form.cleaned_data.get('telephone')
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = User.objects.create_user(telephone=telephone, username=username, password=password)
            login(request, user)
            return redirect(reverse('news:index'))
        else:
            message = form.get_error()
            messages.info(request, message)
            return redirect(reverse('xfzauth:register'))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Django—form组件 is_valid 校验机制
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档