mingmei123 发表于 2023-7-3 01:14:06

我这样写哪里出错了

为什么不能顺利的报错?返回JSON格式那两句代码是不是写错了?


@csrf_exempt
def task_add(request):
    print(request.POST)
    # {'level': ['2'], 'title': ['得到的答复'], 'detail': ['静安分局附件'], 'user': ['2']}

    # 1.用户发过来的数据进行校验
    form = TaskModelForm(data=request.POST)
    if form.is_valid():
      form.save()
      # 不能返回redict,还是要返回JSON格式
      data_dict = {"status": True}
      return JsonResponse(data_dict)

    # print(type(form.errors.as_json()))
    # from django.forms.utils import ErrorDict
    data_dict = {"status": False, 'error': form.errors}
    return JsonResponse(data_dict, ensure_ascii=False)



前端页面:
{% extends 'layout.html' %}


{% block content %}
    <div class="container">
      <div class="panel panel-default">
            <div class="panel-heading">表单</div>
            <div class="panel-body">

                <form id="formAdd">
                  <div class="clearfix">
                        {% for field in form %}
                            <div class="col-xs-6">
                              <div class="form-group" style="position: relative;margin-bottom: 20px;">
                                    <label>{{ field.label }}</label>
                                    {{ field }}
                                    <span class="error-msg" style="color: red;position: absolute"></span>
                              </div>
                            </div>
                        {% endfor %}

                        <div class="col-xs-12">
                            <button id="btnAdd" type="button" class="btn btn-primary">提 交</button>
                        </div>
                  </div>

                </form>


            </div>
      </div>

      <hr/>
      <h1>Ajax学习</h1>
      <h3>示例1</h3>
      <input id="btn1" type="button" class="btn btn-primary" value="点击1" alt="">

      <h3>示例2</h3>
      <input type="text" id="txtUser" placeholder="姓名"/>
      <input type="text" id="txtAge" placeholder="年龄"/>
      <input id="btn2" type="button" class="btn btn-primary" value="点击2"/>

      <h3>示例3</h3>
      <form id="form3">
            <input type="text" name="name" placeholder="姓名"/>
            <input type="text" name="age" placeholder="年龄"/>
            <input type="text" name="email" placeholder="邮箱"/>
            <input type="text" name="more" placeholder="介绍"/>
      </form>
      <input id="btn3" type="button" class="btn btn-primary" value="点击3"/>

    </div>
{% endblock %}

{% block js %}
    <script type="text/javascript">
      $(function () {
            // 页面框架加载完成之后代码自动执行
            bindBtn1Event();
            bindBtn2Event();
            bindBtn3Event();
            bindBtnAddEvent();

      })

      function bindBtn1Event() {
            $('#btn1').click(function () {
                $.ajax({
                  url: '/task/ajax/',
                  type: 'post',
                  data: {
                        ni: 123,
                        n2: 456
                  },
                  dataType: "JSON",
                  {#将字符串res转化为前端对象#}
                  success: function (res) {
                        console.log(res);
                        console.log(res.status);
                        console.log(res.data);
                  }
                })

            })
      }

      function bindBtn2Event() {
            $('#btn2').click(function () {
                $.ajax({
                  url: '/task/ajax/',
                  type: 'post',
                  data: {
                        name: $("#txtUser").val(),
                        age: $("#txtAge").val()
                  },
                  dataType: "JSON",
                  {#将字符串res转化为前端对象#}
                  success: function (res) {
                        console.log(res);
                        console.log(res.status);
                        console.log(res.data);
                  }
                })

            })
      }

      function bindBtn3Event() {
            $('#btn3').click(function () {
                $.ajax({
                  url: '/task/ajax/',
                  type: 'post',
                  data: $("#form3").serialize(),
                  dataType: "JSON",
                  {#将字符串res转化为前端对象#}
                  success: function (res) {
                        console.log(res);
                        console.log(res.status);
                        console.log(res.data);
                  }
                })

            })
      }

      function bindBtnAddEvent() {
            $('#btnAdd').click(function () {

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

                $.ajax({
                  url: '/task/add/',
                  type: 'post',
                  data: $("#formAdd").serialize(),
                  dataType: "JSON",
                  {#将字符串res转化为前端对象#}
                  success: function (res) {
                        if (res.status) {
                            alert("添加成功");
                        } else {
                            {#console.log(res.error)#}
                            $.each(res.error, function (name, data) {
                              {#console.log(name,data);#}
                              $("#id_" + name).next().text(data);
                            })
                        }
                  }
                })

            })
      }
    </script>
{% endblock %}

mingmei123 发表于 2023-7-3 01:15:40

py文件中这两句中有没有问题?
data_dict = {"status": False, 'error': form.errors}
return JsonResponse(data_dict, ensure_ascii=False)

mingmei123 发表于 2023-7-3 01:51:45

难道一定要这样写吗?


data_dict = {"status": False, 'error': form.errors}
return HttpResponse(json.dumps(data_dict, ensure_ascii=False))

isdkz 发表于 2023-7-3 08:11:27

看起来你的代码应该是可以正常工作的。然而,如果你遇到问题,我会建议检查以下几点:

1. 确保你的视图task_add正确映射到 URL '/task/add/'。
2. 检查你的TaskModelForm是否正确处理并验证数据。在 form.is_valid() 失败的情况下,你将获得 form.errors ,其中包含了错误信息。
3. 检查你是否使用了 Django 的 CSRF 中间件。由于你使用了@csrf_exempt装饰器,因此你的 POST 请求不需要 CSRF 令牌。但如果你没有使用 CSRF 中间件,那么你可能需要在你的 AJAX 请求中包含 CSRF 令牌。
4. 检查你的前端页面是否正确发送数据。使用浏览器的开发者工具,你可以查看网络请求的详细信息,包括发送的数据和服务器的响应。你也可以使用console.log来调试你的 JavaScript 代码。

如果你能提供更多的错误信息或者说明问题的具体表现,我可以给你更具体的帮助。例如,你可以告诉我:你的视图是否收到 POST 请求? form.is_valid()是否返回True ?你在浏览器的开发者工具中看到的请求和响应是什么?你的 JavaScript 控制台是否显示任何错误?

编程追风梦 发表于 2023-7-3 10:21:04

根据你提供的代码,有几个问题可能导致无法顺利报错。

1. 在`task_add`视图函数中,你使用了`@csrf_exempt`装饰器,该装饰器用于绕过CSRF保护。如果你的Django项目启用了CSRF保护,这可能导致请求被拦截并返回403 Forbidden错误。请确保在处理表单提交的视图函数中适当处理CSRF令牌。

2. 在前端页面的模板中,你给表单元素添加了`name`属性,但在JavaScript代码中却使用了不同的ID来获取表单数据。请确保在JavaScript代码中使用与表单元素的`name`属性相匹配的ID来获取表单数据。例如,将`$("#txtUser").val()` 修改为 `$("input").val()`。

3. 在JavaScript代码中,你的Ajax请求指定了`dataType: "JSON"`,这表示期望从服务器端接收到的响应是JSON格式的数据。但是在Django视图函数中,你使用`JsonResponse`来返回响应,这是正确的。但请确保在Django视图函数中正确设置响应的Content-Type为"application/json"。例如:
from django.http import JsonResponse

...

def task_add(request):
    ...
    response = JsonResponse(data_dict)
    response['Content-Type'] = 'application/json'
    return response


4. 另外,请确保你的项目A模块已经正确安装并在虚拟环境中。可以使用`pip list`命令来检查项目A是否存在于虚拟环境中的安装包列表中。

求求给个最佳答案吧

mingmei123 发表于 2023-7-3 13:26:24

isdkz 发表于 2023-7-3 08:11
看起来你的代码应该是可以正常工作的。然而,如果你遇到问题,我会建议检查以下几点:

1. 确保你的视图...

你提的以上几点都排查过了,是没问题的。浏览器的开发者工具报错信息如下

我想着ensure_ascii=False是防止中文乱码的,应该不能放在JsonResponse(我删了ensure_ascii=False之后可以运行了)。点开JsonResponse源码,果然没有这个参数,不知道该写另外的哪个参数。不咋会看源码{:10_266:}

mingmei123 发表于 2023-7-3 13:28:18

编程追风梦 发表于 2023-7-3 10:21
根据你提供的代码,有几个问题可能导致无法顺利报错。

1. 在`task_add`视图函数中,你使用了`@csrf_exem ...

报错信息如下

isdkz 发表于 2023-7-3 13:28:44

mingmei123 发表于 2023-7-3 13:26
你提的以上几点都排查过了,是没问题的。浏览器的开发者工具报错信息如下

我想着ensure_ascii=False是 ...

ensure_ascii=False是json.dumps()方法的参数,用于确保非 ASCII 字符正确输出。如果你在直接调用json.dumps()时使用它,你可以得到期望的效果。

然而,Django 的JsonResponse并不直接接受这个参数。它有一个参数json_dumps_params,你可以通过这个参数将ensure_ascii=False传递给内部的json.dumps()方法。

你可以像这样做:

return JsonResponse(data_dict, json_dumps_params={'ensure_ascii': False})


这样, JsonResponse将正确处理非 ASCII 字符,避免出现乱码问题。你也可以通过json_dumps_params参数传递任何其他json.dumps()接受的参数。

mingmei123 发表于 2023-7-3 13:31:19

isdkz 发表于 2023-7-3 13:28
ensure_ascii=False是json.dumps()方法的参数,用于确保非 ASCII 字符正确输出。如果你在直接调用...

json_dumps_params是什么意思啊?我在源码也看到它了,然而并不会用......能不能用通俗的话解释一下

isdkz 发表于 2023-7-3 13:34:57

本帖最后由 isdkz 于 2023-7-3 13:41 编辑

mingmei123 发表于 2023-7-3 13:31
json_dumps_params是什么意思啊?我在源码也看到它了,然而并不会用......能不能用通俗的话解释一下

看参数名就能看出来呀

json模块的(_)dumps函数的(_)parameters(参数)
页: [1]
查看完整版本: 我这样写哪里出错了