django中的ajax_post请求

本文介绍了在Django中如何处理Ajax的POST请求,特别是解决CSRF问题。POST请求需要将数据组织成字典并包含csrf_token。内容涵盖了静态页面的设置、视图函数views.py的编写、form表单以及数据库模型的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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),






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值