4 基于Ajax在注册页面显示错误信息 & forms组件的局部钩子与全局钩子的应用

image

register.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'blog/bootstrap/css/bootstrap.css' %}">
    <style>
        #avatar_img {
            margin-left: 20px;
        }
        #avatar {
            display: none
        }
        .error {
            color: red;
        }
    </style>
</head>
<body>

<div class="container">
    <div class="row">
        <div class="col-md-6 col-lg-offset-3">
            <h3>注册页面</h3>
            <form id="form">
                {% csrf_token %}

                {% for filed in form %}
                    <div class="form-group">
                        <label for="{{ filed.auto_id }}">{{ filed.label }}</label>
                        {{ filed }}
                        <span class="error pull-right"></span>
                    </div>
                {% endfor %}

                <div class="form-group">
                    <label for="avatar">
                        头像
                        <img id="avatar_img" src="{% static 'blog/img/default.png' %}" width="50">
                    </label>

                    <input type="file" id="avatar">
                </div>

                <input type="button" class="btn btn-default reg_btn pull-right" value="注册">
            </form>
        </div>
    </div>
</div>

<script src="{% static 'blog/js/jquery-3.6.0.min.js' %}"></script>
<script>
    // change状态改变后生效
    $("#avatar").change(function () {
        // 1.获取用户选中的文件对象
        var file_obj = $(this)[0].files[0];
        // 2.获取文件对象的路径
        var reader = new FileReader();
        reader.readAsDataURL(file_obj);  // 异步的
        reader.onload = function () {
            // 3.修改img的src路径,src=文件对象的路径
            $('#avatar_img').attr('src', reader.result)
        } // onload同步,会等待异步代码执行完,在执行
    })

    // 基于ajax提交数据
    $('.reg_btn').click(function () {
        var form_data = new FormData();
        var request_data = $('#form').serializeArray()
        $.each(request_data, function (index, data) {
            form_data.append(data.name, data.value)
        })
        form_data.append('avatar', $('#avatar')[0].files[0]);

        $.ajax({
            url: "", // 当前的url,
            type: 'post',
            contentType: false,
            processData: false,
            data: form_data,
            success: function (res) {
                if (res.data){

                }else {
                    $('span.error').html("").parent().removeClass('has-error');  // 情况错误信息
                    // 展示此次提交的错误信息
                    $.each(res.msg, function (field, error_list) {
                        console.log(field, error_list);
                        $('#id_' + field).next().html(error_list[0]).parent().addClass('has-error');
                    })
                }
            }
        })
    })

</script>
</body>
</html>

image

views.py
from django import forms
from blog import models


class UserForm(forms.Form):
    user = forms.CharField(
        max_length=32,
        label='用户名',
        # 错误信息提示
        # 方式1:在settings中,修改LANGUAGE_CODE = 'zh-hans'
        # 方式2:
        error_messages={"required": "该字段不能为空"},
        widget=forms.widgets.TextInput(attrs={'class': 'form-control'})
    )
    pwd = forms.CharField(
        max_length=32,
        label='密码',
        widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'})
    )
    re_pwd = forms.CharField(
        max_length=32,
        label='确认密码',
        widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'})
    )
    email = forms.EmailField(
        label='邮箱',
        widget=forms.widgets.EmailInput(attrs={'class': 'form-control'})
    )

    def clean_user(self):
        user = self.cleaned_data['user']
        user_obj = models.UserInfo.objects.filter(username=user).first()
        if not user_obj:
            return user
        else:
            raise ValidationError("该用户已注册")

    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        re_pwd = self.cleaned_data.get('re_pwd')

        if pwd and re_pwd:
            if pwd == re_pwd:
                return self.cleaned_data
            else:
                raise ValidationError("两次密码不一致")
        else:
            return self.cleaned_data


def register(request):
    if request.is_ajax():
        print(request.POST)
        form = UserForm(data=request.POST)

        response = {'user': None, 'msg': None}
        if form.is_valid():
            response['user'] = form.cleaned_data.get('user')
        else:
            print(form.cleaned_data)
            print(form.errors)
            response['msg'] = form.errors
        return JsonResponse(response)

    form = UserForm()
    return render(request, 'register.html', {'form': form})
register.html(根据以上register)
<script>
    // change状态改变后生效
    $("#avatar").change(function () {
        // 1.获取用户选中的文件对象
        var file_obj = $(this)[0].files[0];
        // 2.获取文件对象的路径
        var reader = new FileReader();
        reader.readAsDataURL(file_obj);  // 异步的
        reader.onload = function () {
            // 3.修改img的src路径,src=文件对象的路径
            $('#avatar_img').attr('src', reader.result)
        } // onload同步,会等待异步代码执行完,在执行
    })

    // 基于ajax提交数据
    $('.reg_btn').click(function () {
        var form_data = new FormData();
        var request_data = $('#form').serializeArray()
        $.each(request_data, function (index, data) {
            form_data.append(data.name, data.value)
        })
        form_data.append('avatar', $('#avatar')[0].files[0]);

        $.ajax({
            url: "", // 当前的url,
            type: 'post',
            contentType: false,
            processData: false,
            data: form_data,
            success: function (res) {
                if (res.data){

                }else {
                    $('span.error').html("").parent().removeClass('has-error');  // 情况错误信息
                    // 展示此次提交的错误信息
                    $.each(res.msg, function (field, error_list) {
                        if (field == "__all__"){
                            $('#id_re_pwd').next().html(error_list[0]).parent().addClass('has-error');
                        } // 两次密码不一致错误
                        $('#id_' + field).next().html(error_list[0]).parent().addClass('has-error');
                    })
                }
            }

        })
    })
</script>
posted @ 2022-08-17 09:58  角角边  Views(18)  Comments(0)    收藏  举报