鱼C论坛

 找回密码
 立即注册
查看: 382|回复: 9

[已解决]我这样写哪里出错了

[复制链接]
发表于 2023-7-3 01:14:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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

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

  12.     # print(type(form.errors.as_json()))
  13.     # from django.forms.utils import ErrorDict
  14.     data_dict = {"status": False, 'error': form.errors}
  15.     return JsonResponse(data_dict, ensure_ascii=False)
复制代码




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


  2. {% block content %}
  3.     <div class="container">
  4.         <div class="panel panel-default">
  5.             <div class="panel-heading">表单</div>
  6.             <div class="panel-body">

  7.                 <form id="formAdd">
  8.                     <div class="clearfix">
  9.                         {% for field in form %}
  10.                             <div class="col-xs-6">
  11.                                 <div class="form-group" style="position: relative;margin-bottom: 20px;">
  12.                                     <label>{{ field.label }}</label>
  13.                                     {{ field }}
  14.                                     <span class="error-msg" style="color: red;position: absolute"></span>
  15.                                 </div>
  16.                             </div>
  17.                         {% endfor %}

  18.                         <div class="col-xs-12">
  19.                             <button id="btnAdd" type="button" class="btn btn-primary">提 交</button>
  20.                         </div>
  21.                     </div>

  22.                 </form>


  23.             </div>
  24.         </div>

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

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

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

  41.     </div>
  42. {% endblock %}

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

  51.         })

  52.         function bindBtn1Event() {
  53.             $('#btn1').click(function () {
  54.                 $.ajax({
  55.                     url: '/task/ajax/',
  56.                     type: 'post',
  57.                     data: {
  58.                         ni: 123,
  59.                         n2: 456
  60.                     },
  61.                     dataType: "JSON",
  62.                     {#将字符串res转化为前端对象#}
  63.                     success: function (res) {
  64.                         console.log(res);
  65.                         console.log(res.status);
  66.                         console.log(res.data);
  67.                     }
  68.                 })

  69.             })
  70.         }

  71.         function bindBtn2Event() {
  72.             $('#btn2').click(function () {
  73.                 $.ajax({
  74.                     url: '/task/ajax/',
  75.                     type: 'post',
  76.                     data: {
  77.                         name: $("#txtUser").val(),
  78.                         age: $("#txtAge").val()
  79.                     },
  80.                     dataType: "JSON",
  81.                     {#将字符串res转化为前端对象#}
  82.                     success: function (res) {
  83.                         console.log(res);
  84.                         console.log(res.status);
  85.                         console.log(res.data);
  86.                     }
  87.                 })

  88.             })
  89.         }

  90.         function bindBtn3Event() {
  91.             $('#btn3').click(function () {
  92.                 $.ajax({
  93.                     url: '/task/ajax/',
  94.                     type: 'post',
  95.                     data: $("#form3").serialize(),
  96.                     dataType: "JSON",
  97.                     {#将字符串res转化为前端对象#}
  98.                     success: function (res) {
  99.                         console.log(res);
  100.                         console.log(res.status);
  101.                         console.log(res.data);
  102.                     }
  103.                 })

  104.             })
  105.         }

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

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

  109.                 $.ajax({
  110.                     url: '/task/add/',
  111.                     type: 'post',
  112.                     data: $("#formAdd").serialize(),
  113.                     dataType: "JSON",
  114.                     {#将字符串res转化为前端对象#}
  115.                     success: function (res) {
  116.                         if (res.status) {
  117.                             alert("添加成功");
  118.                         } else {
  119.                             {#console.log(res.error)#}
  120.                             $.each(res.error, function (name, data) {
  121.                                 {#console.log(name,data);#}
  122.                                 $("#id_" + name).next().text(data[0]);
  123.                             })
  124.                         }
  125.                     }
  126.                 })

  127.             })
  128.         }
  129.     </script>
  130. {% endblock %}
复制代码
最佳答案
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()  方法。

你可以像这样做:

  1. return JsonResponse(data_dict, json_dumps_params={'ensure_ascii': False})
复制代码


这样, JsonResponse  将正确处理非 ASCII 字符,避免出现乱码问题。你也可以通过  json_dumps_params  参数传递任何其他  json.dumps()  接受的参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-3 01:15:40 | 显示全部楼层
py文件中这两句中有没有问题?
  1. data_dict = {"status": False, 'error': form.errors}
  2. return JsonResponse(data_dict, ensure_ascii=False)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-3 01:51:45 | 显示全部楼层
难道一定要这样写吗?


  1. data_dict = {"status": False, 'error': form.errors}
  2. return HttpResponse(json.dumps(data_dict, ensure_ascii=False))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 控制台是否显示任何错误?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[name='name']").val()`。

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

  2. ...

  3. def task_add(request):
  4.     ...
  5.     response = JsonResponse(data_dict)
  6.     response['Content-Type'] = 'application/json'
  7.     return response
复制代码


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

求求给个最佳答案吧

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

1. 确保你的视图  ...

你提的以上几点都排查过了,是没问题的。浏览器的开发者工具报错信息如下
1.png
我想着ensure_ascii=False是防止中文乱码的,应该不能放在JsonResponse(我删了ensure_ascii=False之后可以运行了)。点开JsonResponse源码,果然没有这个参数,不知道该写另外的哪个参数。不咋会看源码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-3 13:28:18 | 显示全部楼层
编程追风梦 发表于 2023-7-3 10:21
根据你提供的代码,有几个问题可能导致无法顺利报错。

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

报错信息如下
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()  方法。

你可以像这样做:

  1. return JsonResponse(data_dict, json_dumps_params={'ensure_ascii': False})
复制代码


这样, JsonResponse  将正确处理非 ASCII 字符,避免出现乱码问题。你也可以通过  json_dumps_params  参数传递任何其他  json.dumps()  接受的参数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

json_dumps_params是什么意思啊?我在源码也看到它了,然而并不会用......能不能用通俗的话解释一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-3 13:34:57 | 显示全部楼层
本帖最后由 isdkz 于 2023-7-3 13:41 编辑
mingmei123 发表于 2023-7-3 13:31
json_dumps_params是什么意思啊?我在源码也看到它了,然而并不会用......能不能用通俗的话解释一下


看参数名就能看出来呀

json模块的(_)dumps函数的(_)parameters(参数)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 14:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表