我正在建立一个评级系统,并且正在努力将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']是正确的用法?
答案 0 :(得分:0)
我可以建议一些至少可以帮助我们弄清楚问题所在的事情:
在您的设置中设置 DEBUG = True ,这样您就可以在结果中获得整个追溯而不仅仅是500.
将您在视图中获得的答案发布给我们:打印请求['POST']
根据您的模型使用ModelForm并使用Django内置表单验证来帮助您处理数据。
希望它有所帮助。
答案 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))