在Django视图中使用JSON数据

时间:2013-10-23 17:11:42

标签: jquery django json pythonanywhere

我正在建立一个评级系统,并且正在努力将JSON数据用于我的Django视图。最终目标是将评级保存到我的BlogSiteRating模型中:

#models.py
class BlogSiteReview(models.Model):
  blog_site = models.ForeignKey(BlogSite)
  review_rating = models.IntegerField()

然而,我还没有达到这一点。我遇到403错误,但是已经通过在POST中正确使用csrf令牌解决了这些错误。现在我收到从服务器传回的500错误,可以在chrome控制台中看到。

编辑:最后发现错误。正在执行2个POST。两者都给出了MultiValueDictKeyError错误

第一个说:“< QueryDict:{u'rating [rating]':[u'10'],u'rating [csrfmiddlewaretoken]':[u'0468d70cfb6fc425a530d434f5a4c30a']中找不到关键'评级', u'rating [rateid]':[u'7']}>

第二个说:“关键'评级'未找到”< QueryDict:{u'action':[u'rating'],u'rate':[u'10'],u'idBox':[u'7']}>“

这是我传递给我视图的JSON。

//JSON object being passed into views.py
$(".rating").jRating({
      onSuccess : function(element,rate){
          var rating = [
            { "id":element.id.replace('rating', ''), "rating":rate}
          ];

          rating["csrfmiddlewaretoken"] = $('input[name=csrfmiddlewaretoken]').val();

          alert("Passed id:" + element.id.replace('rating', '') + " and rating:" + rate);

          //send post data to django view
          $.post('/blogsearch/setrating/', {"rating":rating}, function(msg)
            {
                if(msg.error == "yes")
                {console.log('Error Found: '+ msg.errorMsg);}
            }, 'json');
      },
      onError : function(){
        alert('Error : please retry again later, the server did not accept your submission.');
      }
    });

最后,这是我在views.py中的内容:

#views.py
from django.http import HttpResponse
from django.utils import simplejson

def setrating(request):
    if request.is_ajax():
        if request.method == 'POST':
            simplejson.loads(request.POST['rating'])
            #data = 1 #Note: when I uncomment this line, and 
                      #comment the above line, I don't get a 500 error
    return HttpResponse("success")

另外,我知道在这个例子中我并没有尝试在模型中保存任何东西。如果我可以在我的视图中获取JSON数据,我应该可以从那里保存它而不会出现问题。但是,如果您希望在答案中能够帮助解决该问题。


我一直在看帖子几天了,其中一些让我走上这条道路的是:

internal server eroor 500 django when using simplejson.loads(request.raw_post_data)

Getting internal server error when trying to handle json in django

我也试过导入json而不是simplejson,我得到了相同的结果。 我也玩过使用request.raw_post_data,但是我用这种方法得到了服务器错误。从我所看到的看起来像request.POST ['rating']是正确的用法?

2 个答案:

答案 0 :(得分:0)

我可以建议一些至少可以帮助我们弄清楚问题所在的事情:

  1. 在您的设置中设置 DEBUG = True ,这样您就可以在结果中获得整个追溯而不仅仅是500.

  2. 将您在视图中获得的答案发布给我们:打印请求['POST']

  3. 根据您的模型使用ModelForm并使用Django内置表单验证来帮助您处理数据。

  4. 希望它有所帮助。

答案 1 :(得分:0)

知道了 - 有2个问题。

首先,在JS中,我注意到有2个POST正在执行。我实际上不需要编写任何JS,JRating自己执行POST,并将其发送到我在插件设置中设置的变量。

另一个问题(更重要的一个)在views.py中。我期待一个名为'rating'的变量,因为这是我在JS中设置的。实际上,我需要单独获取每个变量,其中一个POST调用甚至没有使用评级变量。

def setrating(request):
    if request.is_ajax():
        if request.method == 'POST':
            rating = json.loads(request.POST['rate'])
            id = json.loads(request.POST['idBox'])
    return HttpResponse("the rating for " + str(id) + " is " + str(rating))