formdata重点:
错误信息展示重点:
html
<div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form id="fm"> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="{{ field.id_for_label }}">{{ field.label }}</label> {{ field }} <span class="error-info pull-right"></span> </div> {% endfor %} <div class="form-group"> <label for="id_avatar">头像 <img width="60" height="60" id="avatar_img" src="/static/blog/img/default_avatar.jpg"> </label> <input type="file" name="avatar" id="id_avatar" class="hidden"> </div> <input type="button" id="reg_btn" class="btn btn-info" value="提交"> </form> </div> </div> </div>
views.py
def register(request): if request.is_ajax(): print(request.POST) form = RegForm(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 = RegForm() context = { ‘form‘: form } return render(request, ‘register.html‘, context=context)
js
<script src="/static/blog/js/jquery-3.3.1.js"></script>
<script>
// 头像预览功能
$(‘#id_avatar‘).change(function () { // 图片发生了变化,所以要用change事件
// 获取用户选中的文件对象
let file_obj = $(this)[0].files[0];
// 获取文件对象的路径
let reader = new FileReader(); // 等同于在python里拿到了实例对象
reader.readAsDataURL(file_obj);
reader.onload = function () {
// 修改img的src属性,src = 文件对象的路径
$("#avatar_img").attr(‘src‘, reader.result); // 这个是异步,速度比reader读取路径要快,
// 所以要等reader加载完后在执行。
};
});
// 基于Ajax提交数据
$(‘#reg_btn‘).click(function () {
let formdata = new FormData();
let request_data = $(‘#fm‘).serializeArray();
$.each(request_data, function (index, data) {
formdata.append(data.name, data.value)
});
formdata.append(‘avatar‘, $(‘#id_avatar‘)[0].files[0]);
$.ajax({
url: ‘‘,
type: ‘post‘,
contentType: false,
processData: false,
data: formdata,
success: function (data) {
if (data.user) {
// 注册成功
} else {
// 注册失败
// 清空错误信息,每次展示错误信息前,先把之前的清空了。
$(‘span.error-info‘).html("");
$(‘.form-group‘).removeClass(‘has-error‘);
// 展示此次提交的错误信息
$.each(data.msg, function (field, error_list) {
$(‘#id_‘ + field).next().html(error_list[0]);
$(‘#id_‘ + field).parent().addClass(‘has-error‘); // has-error是bootstrap提供的
});
}
}
})
})
</script>
原文:https://www.cnblogs.com/lshedward/p/10384218.html