后端视图代码:
def register(request):
print(request.POST)
if request.method == 'POST':
form = RegModelForm(request.POST) #自定义了一个form组件,继承ModelForm
if not form.is_valid():
return JsonResponse({'status': False, 'errors': form.errors})
form.save()
return JsonResponse({'status': True})
form = RegModelForm()
return render(request, 'register.html', {"form": form})
前端模板的htm代码:
<form id="regForm" method="post">
{% csrf_token %}
{% for item in form %}
{% if item.name == 'code' %}
<div class="form-group ">
<label for="id_code">{{ item.label }}:</label>
<div class="clearfix">
<div class="col-md-6" style="padding-left: 0;">{{ item }}</div>
<div class="col-md-4">
<input type="button" class="btn btn-default code-btn" value="点击获取验证码">
</input>
<p class="error-msg"></p>
</div>
</div>
</div>
{% else %}
<div class="form-group">
<label for="id_{{ item.name }}">{{ item.label }}:</label>
{{ item }}
<p class="error-msg"></p>
</div>
{% endif %}
{% endfor %}
<input type="button" class="btn btn-default reg-btn" value="注册"></input>
</form>
js代码(发送ajax)
<script>
$(".reg-btn").click(function () {
$('.error-msg').empty();
$.ajax({
url: '/register/',
type: 'post',
data: $('#regForm').serialize(), //收集表单中的每一个数据
success: function (data) {
if (data.code == 200) {
location.href = '/index/'
} else {
$.each(data.errors, function (field, error) {
$('#id' + field).next().html(error[0])
});
}
},
})
})
</script>
然后如果我使用ajax发送get请求,后端可以接收数据:
<QueryDict: {'csrfmiddlewaretoken': ['Rf1XbV11Yrs7OSCzSEne0mClwCmzb2ooKyj8i1cvDPJOAVTMamALezeOegcnCW6Y'], 'name': ['zhangsan'], 'email': ['1122@11'], 'pwd': ['1234'], 're_pwd': ['1234'], 'tel': ['468468'], 'code': ['23400']}>
[11/May/2022 19:24:29] "GET /register/?csrfmiddlewaretoken=Rf1XbV11Yrs7OSCzSEne0mClwCmzb2ooKyj8i1cvDPJOAVTMamALezeOegcnCW6Y&name=zhangsan&email=1122%4011&pwd=1234&re_pwd=1234&tel=468468&code=23400 HTTP/1.1" 200 7256
但是如果使用ajax发送post请求,后端接收不到数据,然后就报403错误:
Forbidden (CSRF token missing or incorrect.): /register/
[11/May/2022 19:28:01] "POST /register/ HTTP/1.1" 403 2514
按道理说get请求里面就带有csrf的值,那么数据就没有问题,但是现在报了403错误,就说明数据在发送post请求时没有发送到后端,百度了比较多,也见到过这样的问题