2401_83940696 2024-07-24 11:12 采纳率: 2.1%
浏览 1
已结题

为什么会找不到post?

以下是我的代码,我利用ajax实现信息的传递,但为什么会报错没有属性post?
前端代码

html>
<head>
    <meta http-equiv="content-type" content="text/html;
    charset=UTF-8">
    <meta name="viewport" content="width=device-width,
    initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>登录</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css'%}">
    <link rel="stylesheet" href="{% static 'plugins/font-awesome-4.7.0/css/font-awesome.css'%}">
    <link rel="stylesheet"
          href="{% static 'plugins/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css'%}">
</head>
<body>
<div class="account">
    <h2 style="margin-top:0">用户登录</h2>
     <form id="smsForm" method="POST" style="margin-top:20px;" novalidate>
        {% csrf_token %}
        {% for field in form %}
        {% if field.name == 'code' %}
        <div class="form-group" style="margin-top:20px;">
            <label> {{ field.label}}</label>
            <div class="clearfix">
                <div class="col-md-6" style="padding:0;">{{field}}
                <span class="error-msg" style="color:red;position:absolute"></span></div>
                <div class="col-md-6"><input id="btnSms" type="button" class="btn btn-default" value="点击获取验证码"></div>
            </div>
            <span class="error-msg" style="color:red;position:absolute"></span>
        </div>
        {% else %}
        <div class="form-group" style="margin-top:20px;">
            <label> {{ field.label}}</label>
            {{field}}
            <span class="error-msg" style="color:red;position:absolute"></span>
            {% endif %}
            {%endfor%}

        <input id="btnSubmit" style="height:35px;width:200px; margin-left:90px; font-size:17px;" type="button" value="登录"
                       class="btn btn-info">

            <div>
                 <span style="float: right; margin-top:20px;">已有账号.<a style=" text-decoration:none;" href=" ">去登录</a ></span>
            </div>
        </div>
    </form>
</div>
<script src="{% static 'js/jquery-3.5.1/jquery-3.5.1.min.js'%}
<script>
    //页面加载完自动执行函数
    $(function(){
        bindClickBtnSms();
        bindClickSubmit();
        });

     //点击提交登录
        function bindClickSubmit() {
            $('#btnSubmit').click(function(){
                $(".error-msg").empty();
                //收集数据
                //发送到后台
                $.ajax({
                    url:"/login1/",
                    type:"post",
                    data:$('#smsForm').serialize(),
                    dataType:"json",
                    success:function(res){
                        if(res.success){
                            location.href=res.data;
                       }else{
                        //错误信息
                            $.each(res.error,function(key,value){
                                $('#id_'+key).next().text(value[0]);
                            })
                        }
                    }
                })
            })
        }


    //点击获取验证码的按钮绑定事件
        function bindClickBtnSms(){
            $('#btnSms').click(function(){

            $(".error-msg").empty();

            //获取用户输入的手机号
            var mobile=$('#id_mobile').val();

            $.ajax({
                url:"/send/sms/",
                type:"GET",
                data:{mobile: mobile,tpl: "login"},
                dataType: 'json',
                success:function(res){
                    //ajax请求发送成功后,自动执行函数
                    if (res.status){
                        sendSmsRemind();
                    }else{
                        //错误信息
                        $.each(res.error,function(key,value){
                            $('#id_'+key).next().text(value[0]);
                            })
                        }
                    },
                     error:function(xhr,status,error){
                        console.log('ajax请求失败:'+error)}
                })
            })
        }
       //倒计时
        function sendSmsRemind() {
            var $smsBtn=$('#btnSms');
            $smsBtn.prop('disabled',true);  //禁用
            var time =60;
            var remind=setInterval(function (){
                $smsBtn.val(time + '秒重新发送');
                time=time-1;
                if (time<1){
                    clearInterval(remind);
                    $smsBtn.val('点击获取验证码').prop('disabled',false);
                }
            },1000)
        }
</script>
</body>
</html>

后端代码

class loginForm(BootStrapForm):
    mobile = forms.CharField(label="手机号",
                             validators=[RegexValidator(r'^(1[3|4|5|6|7|8|9])\d{9}$', '手机号格式错误'), ])
    code = forms.CharField(label="短信验证码")

    def clean_mobile(self):
        mobile = self.cleaned_data['mobile']
        exists = models.Username.objects.filter(mobile=mobile).exists()
        if not exists:
            raise ValidationError('手机号不存在')
        return mobile

    def clean_code(self):
        code = self.cleaned_data.get('code')

        mobile = self.cleaned_data.get('mobile')
        if not mobile:
            return code

        conn = get_redis_connection()
        redis_code = conn.get(mobile)
        if not redis_code:
            raise ValidationError('验证码已失效')
        redis_str_code = redis_code.decode('utf-8')
        if code.strip() != redis_str_code:
            raise ValidationError('验证码错误,请重新输入')
        return code
def login1(request):
    if request.method == 'GET':
        form = loginForm()
        return render(request, 'login1.html', {'form': form})

    form = loginForm(request.post)
    if form.is_valid():
        # 用户输入正确,登录成功
        mobile = form.cleaned_data['mobile']
        # 把用户名写入到session中
        user_object = models.Username.objects.filter(mobile=mobile).first()

        request.session['user_id'] = user_object.id
        request.session['user_name'] = user_object.username
        return JsonResponse({'status': True, 'data': '/menu/'})
    return JsonResponse({'status': False, 'error': form.errors})


错误
AttributeError: 'WSGIRequest' object has no attribute 'post'

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-24 11:47
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码和错误信息,问题出现在后端 Django 视图函数 login1 中,您尝试访问 request.post 而不是 request.POST。在 Django 中,请求数据应该通过 request.POST 来访问,而不是 request.post(注意大小写)。

    修正后的后端代码示例:

    from django.http import JsonResponse
    from django.views.decorators.http import require_http_methods
    from .forms import loginForm
    from .models import Username
    from django.core.exceptions import ValidationError
    
    @require_http_methods(["GET", "POST"])
    def login1(request):
        if request.method == 'GET':
            form = loginForm()
            return render(request, 'login1.html', {'form': form})
    
        # 修正:使用 request.POST 而不是 request.post
        form = loginForm(request.POST)
        if form.is_valid():
            mobile = form.cleaned_data['mobile']
            user_object = Username.objects.filter(mobile=mobile).first()
            request.session['user_id'] = user_object.id
            request.session['user_name'] = user_object.username
            return JsonResponse({'status': True, 'data': '/menu/'})
        else:
            # 这里应该返回表单的错误信息
            return JsonResponse({'status': False, 'error': form.errors.as_json()})
    

    其他可能需要注意的事项:

    1. CSRF Token: 确保前端表单中包含了 CSRF 令牌,Django 需要它以保护 POST 请求。

    2. 路由配置: 确保您的 Django 项目中的 urls.py 文件正确配置了路由以指向 login1 视图。

    3. 表单验证: 确保 loginForm 类正确定义,并且 clean_mobileclean_code 方法能够正确地验证数据。

    4. 错误处理: 在 AJAX 调用的 success 函数中,您应该根据后端返回的 JSON 响应来处理错误信息。

    5. 前端按钮类型: 您的登录按钮的类型是 button,这意味着它不会自动提交表单。由于您使用 AJAX 提交,这是正确的,但请确保其他表单元素(如提交按钮)的类型设置正确。

    6. AJAX 调用: 确保 AJAX 调用的 URL 与 Django 路由配置的 URL 相匹配。

    通过上述修正和注意事项,您应该能够解决遇到的 AttributeError 问题。如果问题仍然存在,可能需要进一步检查代码逻辑和配置。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月25日
  • 创建了问题 7月24日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?