ajax - 由于请求对象中的空查询字典,Django json 加载失败
问题描述
我将 ajax 调用发布到 /cart/total ,当我运行 json 加载时,我使用 post 转储存储在本地存储中的 JSON 字符串,它向我显示了错误。
TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not QueryDict
并且我在解析之前的 JSON 字符串看起来像有一个空字段,我在 Django 中不知道
<QueryDict: {'{"32":1,"33":1,"34":2}': ['']}>
<script>
function addtocart(mitem, mprice) {
if(localStorage.getItem('cart')==null){
// var mobj = {}
// var countQ ={}
var price = String(mprice)
var mobj = { [String(mitem)]: 1 }
var countQ = {'Quantity':1}
var storeobj = JSON.stringify(mobj)
var storeCountq = JSON.stringify(countQ)
localStorage.setItem('cart', storeobj)
localStorage.setItem('quantity',storeCountq)
console.log(localStorage.getItem('cart'))
}else{
var data = localStorage.getItem('cart')
var quant = localStorage.getItem('quantity')
var obj = JSON.parse(data)
var parsequant = JSON.parse(quant)
if(obj.hasOwnProperty(String(mitem))){
obj['%s',mitem]++
parsequant['Quantity']++
var storeobj = JSON.stringify(obj)
console.log(localStorage.getItem('cart'))
var storeCountq = JSON.stringify(parsequant)
localStorage.setItem('cart', storeobj)
localStorage.setItem('quantity', storeCountq)
}
else{
obj[String(mitem)] = 1
parsequant['Quantity']++
var storeobj = JSON.stringify(obj)
console.log(localStorage.getItem('cart'))
var storeCountq = JSON.stringify(parsequant)
localStorage.setItem('cart', storeobj)
localStorage.setItem('quantity', storeCountq)
}
}
}
function ajaxcall(){
$.ajax(
{
type: "POST",
url: "/cart/total",
data: localStorage.getItem('cart'),
success: function () {
console.log("sent tdata")
}
})
}
ajaxcall()
</script>
<p style="position: absolute; bottom: 0px"><button class="button" style="width: 200px" onclick="addtocart( '{{M.Menu_Item_Id}}', '{{M.Menu_ItemPrice}}' )" >Add to cart</button>
查看功能
@csrf_exempt
def cartpricecalculator(request):
if request.method == 'POST':
data = json.loads(request.POST)
print(request.POST)
return HttpResponse('200 Okay')
我不确定我做错了什么,感谢任何帮助。
解决方案
尝试:
在 JS 中,传递一个 dict 而不是一个字符串。根据 ajax 的文档,数据必须是具有键和值的对象,或者是具有键和值的对象的字符串化。
参考:https ://api.jquery.com/jQuery.ajax/
function ajaxcall(){
$.ajax(
{
type: "POST",
url: "/cart/total",
data: {'cart': localStorage.getItem('cart')},
success: function () {
console.log("sent tdata")
}
})
}
在蟒蛇
@csrf_exempt
def cartpricecalculator(request):
if request.method == 'POST':
cart_data = json.loads(request.POST.get('cart', '{}'))
print(request.POST)
print(request.POST.get('cart'))
return HttpResponse('200 Okay')
推荐阅读
- python - 如何在 plt 中使用 python Pandas unstack?
- php - 如何使它成为简短的 PHP?
- android - 生成签名APK的Android错误
- java - java paho 库中的行为 setTimeToWait() 方法
- python - ModuleNotFoundError:没有名为“阈值”的模块
- javascript - 通过计算子元素中的跨度值对跨度进行排序
- php - 使用 PHP 获取客户端 IP
- algorithm - 基于玩家偏好的团队创建算法
- javascript - ReactJS - 如何找到 paymentId 的值并呈现它的值作为回报
- ruby-on-rails - 续集模型属性(db 列)的 instance.attribute_name 和 instance[:attribute_name] 是否完全相同?