鱼C论坛

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

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

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

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

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

x
为什么不能顺利的报错?返回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[0]);
                            })
                        }
                    }
                })

            })
        }
    </script>
{% 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()  方法。

你可以像这样做:
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文件中这两句中有没有问题?
data_dict = {"status": False, 'error': form.errors}
return JsonResponse(data_dict, ensure_ascii=False)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

data_dict = {"status": False, 'error': form.errors}
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"。例如:
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是否存在于虚拟环境中的安装包列表中。

求求给个最佳答案吧

想知道小甲鱼最近在做啥?请访问 -> 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()  方法。

你可以像这样做:
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-11-22 01:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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