Django -> 'WSGIRequest' 对象没有属性 'data' -> json.loads(request.data) 错误

问题描述 投票:0回答:3

我看到一个类似的问题,但答案很模糊。我为 updateItem 创建了一个基于函数的视图。我正在尝试根据我的请求加载 json 数据。但出现错误 -> 对象没有属性“数据”

Views.py文件:

def updateItem(request):  
    
    data = json.loads(request.data)
    
    productId = data['productId']
    action = data['action']
    print("productID", productId, "action", action)
    customer = request.user.customer
    product = Product.objects.get(id=productId)
    order, created = Order.objects.get_or_create(customer=customer,complete=False)

    orderItem, created = OrderItem.objects.get_or_create(order=order, product=product)
    
    
    if action == 'add':
        orderItem.quantity = (orderItem.quantity + 1)
    elif action == 'remove':
        orderItem.quantity = (orderItem.quantity - 1)
    orderItem.save()
    
    if orderItem.quantity <= 0:
        orderItem.delete()
        
    return JsonResponse("Item was added!", safe=False)

JS文件:

function updateUserOrder(productId, action) {
    console.log('User is logged in...');
    let url = '/update_item/';

    fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-CSRFToken': csrftoken,
        },
        body: JSON.stringify({ productId: productId, action: action }),
    })
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            console.log('data', data);
        });
}

urls python 文件:

urlpatterns = [
    path("",views.store,name="store"),
    path("cart/",views.cart,name="cart"),
    path("checkout/",views.checkout,name="checkout"),
    path("update_item/",views.updateItem,name="update_item"),
]

错误似乎也发生在我的JS文件中的fetch函数中。用我的方法 POST。找不到解决方案,我在这里做错了什么?

python json django post wsgi
3个回答
1
投票

主要问题是您正在尝试访问“request.data”,没有这样的属性。您想要的是从 POST 请求中检索数据。 (另请注意,好的做法是让您的视图和变量名称采用 snake_case 形式,而 camelCase 用于类):

def updateItem(request):  
    
    data = json.loads(request.POST.get('data'))
    ...
        
    return JsonResponse("Item was added!", safe=False)

虽然,为了完成我的回答,我必须说你的 JS 函数有问题,csrf 令牌没有正确附加。我的测试解决方案:

views.py

from django.shortcuts import render
from django.http import JsonResponse
import json

def update_item(request):
    return render(request, 'update_item.html', {})

def update_item_ajax(request): 
    data = json.loads(request.POST.get('data'))
    print(data)
    ...
    
    return JsonResponse({'message': '"Item was added!"'}, safe=False)

# output of update_item_ajax print
{'productId': 1, 'action': 'myaction'}

urls.py

from django.urls import path
from core import views

app_name = 'core'

urlpatterns = [
    path('update/item/', views.update_item, name='update-item'),
    path('update/item/ajax/', views.update_item_ajax, name='update-item-ajax'),
]

update_item.html

{% extends 'base.html' %}

{% block content %}
<button onclick="updateUserOrder(1, 'action')"> update item </button>
{% endblock %}

{% block script %}
    <script>
        function updateUserOrder(productId, action) {
            console.log('User is logged in...');
            let url = "{% url 'core:update-item-ajax' %}";
            
            var payload = {
                productId: productId,
                action: action
            };
            var data = new FormData();
            data.append( 'data' , JSON.stringify( payload ) );
            data.append('csrfmiddlewaretoken', '{{ csrf_token }}');

            fetch(url, 
            {   
                method: 'POST',
                body: data,
            })
            .then(function(res){ return res.json(); })
            .then(function(data){ console.log(data); });
        }
    </script>
{% endblock %}

0
投票

尝试:

data = json.loads(request.body)

因为请求没有

data
,因为您将数据传递为
body: JSON.stringify({ productId: productId, action: action }),


0
投票

属性是request.body,不是request.data。

© www.soinside.com 2019 - 2024. All rights reserved.