/* 看板娘 */ /* 粒子吸附*/

bbs 注册功能的搭建

目录

'''forms校验'''

from django import forms
from django.forms import widgets
from  blog import  models
from django.core.exceptions import ValidationError
'''注册校验,写入样式'''


class RegisterForm(forms.Form):
    # 名称校验
    username = forms.CharField(
        max_length=18, min_length=3,label='用户名',
        error_messages={'required': '该字段必填', 'max_length': '名字过长,不能超过18个字符',
                        'min_length': '名字过短,不能少于三个字符'},
        widget=widgets.TextInput(attrs={'class': 'form-control'})
    )
    # 密码校验
    password = forms.CharField(
        max_length=18, min_length=3,label='密码',
        error_messages={'required': '该字段必填', 'max_length': '密码过长,不能超过18个字符',
                        'min_length': '密码过短,不能少于三个字符'},
        widget=widgets.PasswordInput(attrs={'class': 'form-control'})
    )
    re_password = forms.CharField(
        max_length=18, min_length=3,label='确认密码',
        error_messages={'required': '该字段必填', 'max_length': '密码过长,不能超过18个字符',
                        'min_length': '密码过短,不能少于三个字符'},
        widget=widgets.PasswordInput(attrs={'class': 'form-control'})
    )

    # 邮箱
    email = forms.EmailField(
        error_messages={'required': '该字段必填', 'invalid': '邮箱格式不正确'},label='邮箱',
        widget=widgets.EmailInput(attrs={'class': 'form-control'})
    )

    # 局部钩子,校验用户是否存在
    def clean_username(self):
        username = self.cleaned_data.get('username')
        # 拿到数据判断用户在不在表中
        user = models.UserInfo.objects.filter(username=username).first()
        if user:
            # 用户存在抛异常
            raise ValidationError('该用户以存在')
        else:
            return username

    # 全局钩子,校验密码是否一致
    def clean(self):
        password = self.cleaned_data.get('password')
        re_password = self.cleaned_data.get('re_password')
        if not password == re_password:
            raise ValidationError('两次密码不一致')
{#注册功能前端功能的设置#}
    {## 发送ajax请求,使用的Formdata#}
    {##form标签.serializeArray()#}
    {##}
    {## 整体代码#}
    $('#id_submit').click(function () {
        let formdata = new FormData()
        formdata.append('myfile', $('#myfile')[0].files[0])
        //方案一
        /*
        formdata.append('username',$('#id_username').val())
        formdata.append('password',$('#password').val())
        formdata.append('re_password',$('#id_re_password').val())
        formdata.append('email',$('#id_email').val())
         */

        //方案二
        {#serializeArray()    将myfile 里面的数据转换成列表的形式#}
        let form_data = $('#my_form').serializeArray()
        //console.log(form_data)
        {#each循环取值#}
        $.each(form_data, function (index, element) {
            //console.log(index)
            //console.log(element)
            formdata.append(element.name, element.value)
        })
        //console.log(formdata.get('username'))
        $.ajax({
            url: '/register/',
            method: 'post',
            contentType: false,
            processData: false,
            data: formdata,
            success: function (data) {
                console.log(data)
                {#跳转到前端页面#}
                if (data.status == 100) {
                    location.href = data.next_url
                    //location.href='/login/'
                } else {
                    {#each循环#}
                    $.each(data.msg, function (key, value) {
                        //console.log('#id_'+key)
                        if (key == '__all__') {
                            //全局钩子抛出的错
                            $('#id_error').html(value[0])
                        } else {
                            //取到input标签的下一个
                            //$('#id_'+key).next().html(value[0])
                            //链式调用
                            //$('#id_'+key).parent().addClass('has-error')
                            //链式调用
                            //局部错误
                            //先取到input框 然后取到input框下面的标签在下面的标签上将操作信息写进来  然后找了一个复空签加了has_error
                            $('#id_' + key).next().html(value[0]).parent().addClass('has-error')

                        }

                    })

                    //加了一个定时器,3s以后干某些事
                    setTimeout(function () {
                        //清除红色框
                        $('.form-group').removeClass('has-error')
                        //清空所有错误信息
                        $('.error').html('')
                    }, 3000)
                }


            }
        })


    })

 

view.py

from django.shortcuts import render,HttpResponse,redirect
from blog import models
# Create your views here.
from blog.blog_forms import RegisterForm
from django import forms
from django.http import JsonResponse


# 数据校验
def register(request):
    if request.method=='GET':
        register_form=RegisterForm()
        return render(request,'register.html',context={'form':register_form})
    elif request.method =='POST':
        response = {'status': 100, 'msg':None}
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            # 数据校验通过
            # 可能传头像   可能没有传头像
            # models.UserInfo.objects.create_user()
            clean_data=register_form.cleaned_data
            print(clean_data)
            my_file =request.FILES.get('myfile')
            if my_file:#上传了头想
            #filefiled字段类型直接接受一个文件对象
            #它会把文件存到upload_to='avatar'/,然后把路径存到数据库中
            # 相当于with open 打开文件,把文件存到avatar路径下 然后把路径赋值给avatar这个字段
                clean_data['avatar'] = my_file
            clean_data.pop('re_password')
            models.UserInfo.objects.create_user(**clean_data)
            response['msg'] = '注册成功'
            # 注册成功跳转到登录页面
            response['next_url'] = '/login/'

        else:
            response['status'] = 101
            response['msg'] = register_form.errors

        return JsonResponse(response)

 

success: function (data) {
                console.log(data)
                {#跳转到前端页面#}
                if (data.status == 100) {
                    location.href = data.next_url
                    //location.href='/login/'
                } else {
                    {#each循环#}
                    $.each(data.msg, function (key, value) {
                        //console.log('#id_'+key)
                        if (key == '__all__') {
                            //全局钩子抛出的错
                            $('#id_error').html(value[0])
                        } else {
                            //取到input标签的下一个
                            //$('#id_'+key).next().html(value[0])
                            //链式调用
                            //$('#id_'+key).parent().addClass('has-error')
                            //链式调用
                            //局部错误
                            //先取到input框 然后取到input框下面的标签在下面的标签上将操作信息写进来  然后找了一个复空签加了has_error
                            $('#id_' + key).next().html(value[0]).parent().addClass('has-error')

                        }

                    })

                    //加了一个定时器,3s以后干某些事
                    setTimeout(function () {
                        //清除红色框
                        $('.form-group').removeClass('has-error')
                        //清空所有错误信息
                        $('.error').html('')
                    }, 3000)
                }


            }
        })

 

posted @ 2022-03-16 20:15  红绿灯的黄呀  阅读(48)  评论(0)    收藏  举报