Django объект JSON должен быть str, bytes или bytearray, а не NoneType
Я создаю сайт электронной коммерции с помощью Django и использую локальное хранилище в качестве корзины и использую кнопку для отправки данных на страницу оформления заказа, а также использую некоторые jquery и ajax для отправки данных на сервер, но когда я отправляю локальное хранилище на сервер, я получаю следующую ошибку, Смотрите ошибку
Мой cart.html выглядит следующим образом, откуда я отправляю данные в checkout,
<form action="/checkout" method="post" >
{% csrf_token %}
<button class="button-78" role="button">Proceed to buy</button>
</form>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script>
$('.plus').click(function(e){
console.log("hello");
e.preventDefault();
cartt=JSON.parse(localStorage.getItem('cart'));
console.log(cartt)
var idstr=this.id.toString();
cartt[idstr]=cartt[idstr]+1;
localStorage.setItem('cart',JSON.stringify(cartt))
$.ajax({
type:"POST",
url:"http://127.0.0.1:8000/cart",
data:{
prodd:localStorage.getItem('cart'),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function(){
location.href = "/cart"
}
});
});
$('.minus').click(function(e){
e.preventDefault();
cartt=JSON.parse(localStorage.getItem('cart'));
var idstr=this.id.toString();
cartt[idstr]=cartt[idstr]-1;
localStorage.setItem('cart',JSON.stringify(cartt))
$.ajax({
type:"POST",
url:"http://127.0.0.1:8000/cart",
data:{
prodd:localStorage.getItem('cart'),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function(){
location.href = "/cart"
}
});
});
$('.button-42').click(function(e){
e.preventDefault();
cartt=JSON.parse(localStorage.getItem('cart'));
var idstr=this.id.toString();
delete cartt[idstr];
localStorage.setItem('cart',JSON.stringify(cartt))
$.ajax({
type:"POST",
url:"http://127.0.0.1:8000/cart",
data:{
prodd:localStorage.getItem('cart'),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function(){
location.href = "/cart"
}
});
});
$('.button-78').click(function(e){
$.ajax({
type:"POST",
url:"http://127.0.0.1:8000/cart",
data:{
prodd:JSON.stringify(localStorage.getItem('cart')),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function(){
location.href = "/checkout"
}
});
});
</script>
А это мой файл views.py,
def checkout(request):
if request.method == "POST":
global context
dict=json.loads(request.POST.get('prodd'))
ldict=list(map(int,dict.keys()))
objects=product.objects.filter(pk__in=ldict)
print(dict)
context={'object':objects,'dict':dict}
return render(request,'checkout.html',context)
Но я попробовал тот же метод в моем файле product.py, где при нажатии кнопки add to cart он успешно переходит на страницу корзины и здесь же постит данные из моего локального хранилища на сервер, но он не показал мне ошибку для этого. Смотрите здесь мою страницу product.html,
<form id="cartSubmit">
{% csrf_token %}
<button id="{{prod.id}}" type="submit" class="cart">
<i class="fa fa-shopping-cart"></i>
Add to cart</button>
</form>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script>
function clickme(smallImg) {
var fullImg = document.getElementById("imagebox");
fullImg.src = smallImg.src;
}
// find out the cart items from localstorage
if(localStorage.getItem('cart')==null){
var cart={};
}
else{
cart=JSON.parse(localStorage.getItem('cart'));
}
// if the cart button is clciked then increment the item
$('.cart').click(function(e){
e.preventDefault();
var idstr=this.id.toString();
console.log(idstr);
if(cart[idstr] != undefined){
cart[idstr] = cart[idstr] + 1;
}
else{
cart[idstr] = 1;
}
localStorage.setItem('cart',JSON.stringify(cart));
$.ajax({
type:"POST",
url:"http://127.0.0.1:8000/cart",
data:{
prodd:JSON.stringify(cart),
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function(){
location.href = "/cart"
}
});
});
</script>
А вот мои взгляды на тележку,
def cart(request):
if request.method == "POST":
global context
log=templates.objects.get(pk=1)
user=templates.objects.get(pk=2)
cart=templates.objects.get(pk=6)
dict=json.loads(request.POST.get('prodd'))
ldict=list(map(int,dict.keys()))
objects=product.objects.filter(pk__in=ldict)
context={'logo':log,'user':user,'cart':cart,'object':objects,'dict':dict}
return render(request,'cart.html',context)
Я пробовал несколько методов, таких как json.loads() и json.dump() и оба вместе, но все равно выдает ту же ошибку. пожалуйста, помогите мне, спасибо заранее.
Я хорошо вижу ваш код, только могу сказать, что вам нужно быть осторожным при получении данных из POST, если вы не уверены, что данные приходят со стороны клиента, поэтому попробуйте получить данные из dict, используя значение по умолчанию с действительным значением или сохранить его перед загрузкой
prodd_val = request.POST.get('prodd', None)
if prodd_val:
prodd_data = json.loads(prodd_val)
else:
raise ValidationError("error message") # or something else
или может быть:
prodd_data = json.loads(request.POST.get('prodd') or {})
и еще один совет - измените имя вашей переменной с "dict" на другое, потому что это зарезервированное имя для типа dict, так что я думаю, что данные не отправляются правильно на сервер, попробуйте вывести данные на печать, используйте print(request.POST) перед строкой json.loads и проверьте, что данные приходят правильно.