При распечатке данных из POST-запроса request.POST.get() возвращает None в Django App
Я создаю веб-приложение для электронной коммерции. Я пытаюсь создать функциональность "добавить в корзину", используя некоторый стоковый html-код карточки товара и добавив слушателя событий к кнопке "добавить в корзину". Сначала я пытался использовать событие щелчка по кнопке, но не смог извлечь количество товара и его название из HTML-страницы товара. Затем я попытался использовать тег формы вокруг кнопки, а затем отправить название товара и его количество с помощью метода post. Когда запрос достигает моего сервера, я пытаюсь получить доступ к данным (сначала просто распечатав их, чтобы я мог решить, как поместить их в мою базу данных), но когда я пробую request.POST.get('Product Name') или request.POST.get('Product Quantity'), возвращаемое значение равно "None". Когда я печатаю request.body, печатается результат b'{'Product Name': , 'Product Quantity': . Я не могу найти способ получить доступ к этим данным для дальнейшего использования. Код следующий:
{% block scripts %}
<script src="/static/js/addToCart.js" defer></script>
{% endblock %}
{% block content %}
<h1>Get Smart Products</h1>
<div class="container">
<ul>
{% for product in product_list %}
<div class="container">
<img src="/media/{{product.product_image}}">
<li>{{ product.name }}</li>
<li>{{ product.category }}</li>
<li>{{ product.price }}</li>
<li>{{ product.description }}</li>
<input type="hidden" value="{{ product.name }}" id="prod_name">
<label for="Quantity">Quantity</label>
<div class="input-group text-center mb-3" style="width:130px;">
<button class="input-group-text decrement-btn">-</button>
<input type="text" name="quantity" class="form-control qty-input text-center" value="1" id="quantity-btn">
<button class="input-group-text increment-btn">+</button>
</div>
<form action="" method="post">
{% csrf_token %}<button class="btn btn-danger addToCartBtn" id="addToCartBtn">Add to cart</button>
</form>
</div>
{% endfor %}
</ul>
</div>
{% endblock %}
JS-код
axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"
document.getElementById("addToCartBtn").addEventListener("click", function(e){
e.preventDefault();
const product_input = document.getElementById("prod_name").value
const product_quantity = Number(document.getElementById("quantity-btn").value)
console.log(product_input,product_quantity)
axios.post('/ecomm/addToCart/', {'Product Name': product_input, 'Product Quantity':product_quantity}).then((response)=>{
console.log(response)
})
})
код django app.views
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
import requests
from requests_oauthlib import OAuth1
import json
from .models import Product
# Create your views here.
def index(request):
return render(request, 'home.html', {})
def fin_ed_tech(request):
product_list = Product.objects.all()
return render(request, 'get_smart.html', {'product_list': product_list})
def person_pod(request):
return render(request, 'person_pod_essentials.html', {})
def exoskel_maint(request):
return render(request, 'exoskeletonal_maintenance.html', {})
def outer_mind_clothing(request):
return render(request, 'clothing_for_the_outer_mind_wall.html', {})
def about(request):
return render(request, 'about.html', {})
def search(request):
return render(request, 'search.html', {})
def search_products(request):
# print(request.GET.get('query'))
query = request.GET.get('query')
if Product.objects.filter(name__contains=query):
db_vars = Product.objects.filter(name__contains=query)
print(db_vars)
db_data = list(db_vars.values())
return JsonResponse({'db_data': db_data})
else:
auth = OAuth1("793746cd4fcf40bda3e1bc6b5b31b277", "e99e19abfa7347cabbf2591bbf8f48e1")
endpoint = f"http://api.thenounproject.com/icon/{query}"
API_response = requests.get(endpoint, auth=auth)
print(API_response.content)
JSON_API_response = json.loads(API_response.content)
image_url = JSON_API_response['icon']['preview_url']
return JsonResponse({'url':image_url})
# return render(request, 'search_results.html', {})
def addToCart(request):
if request.method == 'POST':
prod_name = request.POST.get('Product Name')
print(prod_name)
return HttpResponseRedirect('get_smart/')
def Cart(request):
pass
Ошибка, которую я получаю
None
[05/Jul/2022 21:21:09] "POST /ecomm/addToCart/ HTTP/1.1" 302 0
Not Found: /ecomm/addToCart/get_smart/
[05/Jul/2022 21:21:09] "GET /ecomm/addToCart/get_smart/ HTTP/1.1" 404 4124
Я новичок, когда дело доходит до всех языков и технологий, используемых здесь, поэтому я ценю все предложения о том, что делать. Спасибо!
Ваши поля находятся вне формы, которую вы отправили. Вы должны написать их внутри следующим образом:
{% block scripts %}
<script src="/static/js/addToCart.js" defer></script>
{% endblock %}
{% block content %}
<h1>Get Smart Products</h1>
<div class="container">
<ul>
{% for product in product_list %}
<div class="container">
<img src="/media/{{product.product_image}}">
<li>{{ product.name }}</li>
<li>{{ product.category }}</li>
<li>{{ product.price }}</li>
<li>{{ product.description }}</li>
<form action="" method="post">
<input type="hidden" value="{{ product.name }}" id="prod_name">
<label for="Quantity">Quantity</label>
<div class="input-group text-center mb-3" style="width:130px;">
<button class="input-group-text decrement-btn">-</button>
<input type="text" name="quantity" class="form-control qty-input text-center" value="1" id="quantity-btn">
<button class="input-group-text increment-btn">+</button>
</div>
{% csrf_token %}<button class="btn btn-danger addToCartBtn" id="addToCartBtn">Add to cart</button>
</form>
</div>
{% endfor %}
</ul>
</div>
{% endblock %}
Кроме того, я предлагаю публиковать id продукта лучше, чем его название.