
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>

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>