【问题标题】:Django + Ajax error in returning data返回数据时Django + Ajax错误
【发布时间】:2015-11-24 06:14:53
【问题描述】:

我有一个名为 Item 的模型,我正在尝试使用 Ajax 创建项目,一切看起来都正常,但是在流程结束时,在 Ajax 的成功函数中出现错误。我已经在 StackOverflow 中阅读了很多此类问题的答案,但我无法让它发挥作用:

这是我的模型:

PRIORITY_CHOICES = (
(1, 'Low'),
(2, 'Normal'),
(3, 'High'),
)

class Item(models.Model):
name = models.CharField(max_length=60)
description = models.TextField(max_length=1000)
created = models.DateTimeField(auto_now_add=True)
priority = models.IntegerField(choices=PRIORITY_CHOICES, default=1)
done = models.BooleanField(default=False)
meeting = models.ForeignKey(Meeting)

def __str__(self):
    return self.name

这是我的观点,可以正常工作并将数据保存到数据库中:

from .forms import AddItemForm
from .utils import render_to_json_response

class AjaxFormResponseMixin(object):
    def form_invalid(self, form):
        return render_to_json_response(form.errors, status=400)

    def form_valid(self, form):

        # save
        self.object = form.save()

        # initialize an empty context
        context = {}

        # return the context as json
        return render_to_json_response(self.get_context_data(context))

class AjaxItemCreateView(AjaxFormResponseMixin, CreateView):
    form_class = AddItemForm

    def get_context_data(self, context):
        context['success'] = True
        context['name'] = self.object.name
        context['description'] = self.object.description
        return context

如您所见,我使用了一个名为 render_to_json_response 的自定义快捷方式来解析 Json 中的数据

这是快捷方式的代码(请注意,我正在打印上下文,以验证数据):

from django.http import JsonResponse

def render_to_json_response(context, **response_kwargs):
    print (context)
    return JsonResponse(context)

(如果你想知道我为什么要使用这个简单的快捷方式,那是因为之前我尝试使用 HttpResponse 返回响应并指定 content_type="application/json",但它也不起作用)

这是我的 ajax 代码:

function AddItem(event){
var csrftoken = getCookie('csrftoken');
var item_name = $('#item-name').val();
var item_desription = $('#item-description').val();
var item_priority = $('#item-priority').val();
var item_meeting_pk = $('#item-meeting-pk').val();
var url = "/item/add/";
$.ajax({
   type: "POST",
   url: url,
   data: {
       'name': item_name,
       'description': item_desription,
       'priority': item_priority,
       'meeting': item_meeting_pk ,
       'csrfmiddlewaretoken': csrftoken
   },
   success: function(data){
    alert("success");
    alert(data);
   },
   complete: function(data){
    alert("completed");
    alert(JSON.stringify(data));
   }
});
}

最后,这是调用 AddItem() 函数的表单:

<form>
   {% csrf_token %}
     <input type="text" placeholder="Nombre del item" id='item-name'/>
     <input type="text" placeholder="Descripción del item" id='item-description'/>
     <select id="item-priority" name="provider" class="form-control">
        <option value="1">Baja</option>
        <option value="2">Normal</option>
        <option value="3">Alta</option>
     </select>
     <input type='hidden' id='item-meeting-pk' value='{{ meeting.pk }}'>
     <button onclick='AddItem()' class="button-blue" >Agregar</button>
     </form>

当我提交表单时,一切正常,在我的 django shell 中,我可以看到 post 请求返回 200 并且数据打印正常:

{'name': 'asdkkasd', 'description': 'sdksdksjd', 'success': True}
[29/Aug/2015 08:34:22]"POST /item/add/ HTTP/1.1" 200 65

在 ajax 函数中,我在成功和完成时都有 javascript 警报,但只有完整的警报正在执行,这就是我通过执行 alert(JSON.stringify(data));:

{"readyState": 0, "responseText":"", "status":0, "statusText": "error"}

希望你能帮帮我,谢谢:)

【问题讨论】:

    标签: javascript jquery ajax json django


    【解决方案1】:

    您的表格几乎可以肯定是无效的;在这种情况下,你会从form_invalid 返回一个 400 状态,这会触发 jQuery 调用 failure 函数(如果有),而不是 success

    很遗憾,在这种情况下,您不能使用正确的 RESTful 状态代码。无效的表单提交仍应返回 200。

    【讨论】:

    • 但是即使表单有效并且数据保存在数据库中,成功函数也不会执行。您认为问题是什么?
    【解决方案2】:

    你正在使用的ajax函数的成功和完整的功能是有区别的...

    success
    

    在响应 200(OK)时调用它。

    complete
    

    这将被调用 always ,顾名思义,请求确实成功了,即使是服务器端失败或 OK 响应。它刚刚成功(即:登陆您的服务器并带回一些东西提供给您的客户(浏览器,移动设备)。所以这是完整的方法。

    您可以取消此方法,仅在不需要时使用成功。

    了解更多信息。 Read here

    仅供参考:

    您显示的 readystate 输出为 0 ,因此请求未初始化。请求完成应为 4。

    【讨论】:

    • 没错,成功是在响应 200 时调用的,正如您在我的 django 服务器中看到的,POST 请求返回 200 但成功函数没有执行
    • 非 200 响应更有可能是导致此行为的原因。检查服务器代码返回的状态。有一个打印语句。
    • 好的,我看到你回复了 200。
    • 是的,这很奇怪。服务器返回200,但是ajax函数没有执行成功
    • 我已经做了很多测试,你猜怎么着?当我使用 postgresql 数据库时,不执行成功函数,但是当我使用 sqlite 时,函数执行并且一切顺利。我不知道为什么会发生这种情况。你有什么想法吗?
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2013-06-03
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多