I don't have a "DATA" attribute in my view.py request
David
I am trying to pass data using jsfunction UpdateUserOrder
$(document).ready(function() {
document.querySelectorAll('.update-cart').forEach(item =>{
item.addEventListener('click', () => {
var productId = item.dataset.product
var action = item.dataset.action
if(user === 'AnonymousUser'){
console.log('not logged in')
}else{
UpdateUserOrder(productId, action)
}
})
})
})
function UpdateUserOrder(productId, action){
console.log('user logged in')
var url = 'add_to_cart/'
fetch(url, {
method: 'POST',
headers: {
'Content-Type':'application/json',
'X-CSRFToken': csrftoken,
},
body:JSON.stringify({'productId':productId,'action':action})
})
.then((response) =>{
return response.json()
})
.then((data) =>{
console.log('data', data)
})
}
{% for product in products %}
<div>
<label id="title-label" for="title">Title</label>
<p id="title">{{ product.title }}</p>
<label id="author-label" for="author">Author</label>
<p id="author">{{ product.author }}</p>
<label for="user">Seller</label>
<p id="user">{{ product.user }}</p>
<p><img src="{{ product.image }}" alt="none"></p>
<a id="link" href="{% url 'market_detail' product.id %}">Details</a>
<button data-product="{{ product.id }}" data-action="add" class="update-cart">add</button>
</div>
{% endfor %}
views.py:
def home(request):
products = Product.objects.filter(sold=False)
context = {'products': products}
return render(request, 'market/home.html', context)
def add_to_cart(request):
data = json.loads(request.DATA)
productId = data['productId']
action = data['action']
print('action:', action, 'productId:', productId)
return JsonResponse('item was added', safe=False)
urls.py:
urlpatterns = [
path('', home, name='home'),
path('detail/<int:pk>/', BookDetailView.as_view(), name='market_detail'),
path('search/', book_search, name='book_search'),
path('add_to_cart/', add_to_cart, name='add_to_cart'),
]
The error I get in the console:
What I'm saying in pycharm's terminal is:
AttributeError: 'WSGIRequest' object has no attribute 'data'
Murillo Citonio
You are sending data through the request body ( body:JSON.stringify({'productId':productId,'action':action})
) , which means you have to access the data in views.py
:
data = json.loads(request.body)
Also, you can always use built-in objects to inspect properties of objects .dir