Ajax_post请求,涉及到post请求就会遇到csrf问题,ajax的post请求,同样需要发生csrf_token。
相比较get请求,post请求:
1、需要一字典格式整合数据
2、需要一个csrf_token,键必须是csrfmiddlewaretoken
其他部分和get请求类似
1、静态页面 ajax_post.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/js/jquery.min.js"></script>
</head>
<body>
<form >//ajax提交不在需要action method form来提交
{% csrf_token %}
{% for u in userForm %}
<p><label >{{ u.label }}</label>
{{ u }}</p>
{% endfor %}
<p><input type="button" id="submit" value="提交"></p>
//label别名
</form>
<script>
$("#submit").click(
function () {
//收集数据
var username=$("#id_username").val();//val获取输入的值 #id_username获取框
var password=$("#id_password").val();//id等于id_字段名
var age=$('#id_age').val();
var email=$("#id_email").val();
var birthday=$("#id_birthday").val();
var csrfmiddlewaretoken='{{ csrf_token }}';
send_data={
"username":username,//和后端对应
"password":password,
"age":age,
"email":email,
"birthday":birthday,
"csrfmiddlewaretoken":csrfmiddlewaretoken,
};
//console.log(data)
//编写请求的url
var url="/apd/";
$.ajax(
{
url:url,//路由
type:"POST",//POST请求类型
data:send_data,//发送数据
success:function (data) {//data数据
console.log(data)
},
error:function(error){
console.log(error)
}
}
)
}
)
</script>
</body>
</html>
2、视图文件 views.py
def ajax_post(request):
userForm=UserForm()
return render (request,"ajax_post.html",locals())
def ajax_post_data(request):
result={"status":"error","content":"请求过来了"}
if request.method=="POST":#如果请求类型是POST
data=UserForm(request.POST)#将post请求的数据传递给UserForm进行校验
#检验数据是否符合规定
if data.is_valid():#如果校验成功,返回true #valid有效的
clean_data=data.cleaned_data#返回一个放着校验过的数据的字典
user = UserModel()#对象实例化
user.username=clean_data.get("username")#规定
user.password=clean_data.get("password")
user.age=clean_data.get("age")
user.email=clean_data.get("email")
user.birthday=clean_data.get("birthday")
user.save()#保存到数据库
result["status"]="success"
result["content"]="数据保存成功"
else:
result["content"]="<br>".join(data.errors)
#errors result[content]=数据错误字段<br>数据错误字段
#多个错误字段之间用<br>分割
else:
result["content"]="请求类型错误"
return JsonResponse(result)#ajax得用Json/Json是一种数据格式
3、forms.py form表单文件
from django import forms
class UserForm(forms.Form):#与数据库类似,但不是数据库
username=forms.CharField(required=False,label="用户名",help_text="用户名可以为空")
password=forms.CharField(max_length=12,min_length=6,label="密码")#label是别名的意思
age=forms.IntegerField(label="年龄")
email=forms.EmailField(label="邮箱")
birthday=forms.DateField(label="生日")
def clean_username(self):#所有自定义的效验的方法一定是clean_效验的字段名
username=self.cleaned_data.get('username')
if "li" in username:
raise forms.ValidationError("昵称违规")
else:
return username
4、数据库模型
from django.db import models
class LoginUser(models.Model):
username=models.CharField(max_length=32)
password = models.CharField(max_length=32)
class UserModel(models.Model):#建立表单提交的数据库#表单数据库
username=models.CharField(max_length=32)
password=models.CharField(max_length=32)
age=models.IntegerField()
email=models.EmailField()
birthday=models.DateField()
5、路由配置
path(‘ap/’,ajax_post),
path(‘apd/’,ajax_post_data),