Django- Получение данных из формы в модель
Я сталкиваюсь с проблемой получения выбранного размера из HTML-шаблона в модель OrderItem.
У меня модель размера определена отдельно и добавлена как внешний ключ в модель OrderItem.
В шаблоне HTML я перебираю доступные размеры, имеющиеся в моей модели Size, среди которых должен быть выбран один, но я не получаю выбранный размер, добавленный в ORderItem
Это модель, которая у меня есть
class Size(models.Model):
name = models.CharField(max_length=255, primary_key=True)
def __str__(self):
return self.name
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
size = models.ForeignKey(Size, on_delete=models.SET_NULL, blank=True, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
А это представления того обновления orderItem и рендеринга размеров
def store(request):
sizes = Size.objects.all()
c1 = ProductCollection.objects.get(name='c1')
products = c1.products.all()
if request.method == "POST":
size = request.POST.get('size')
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
items = order.orderitem_set.all()
cartItems = order.get_cart_items
else:
items = []
order = {'get_cart_total':0, 'get_cart_items':0}
cartItems = order['get_cart_items']
context = {
'c1': c1,
'products': products,
'cartItems': cartItems,
'sizes': sizes,
}
return render(request, 'store.html', context)
def updateItem(request):
data = json.loads(request.body)
productId = data['productId']
action = data['action']
print('Action:', action)
print('Product:', productId)
size = request.POST.get('size')
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, size=size)
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)
Это HTML шаблон
<div class="row" >
{% for product in products %}
<div class="col-lg-4">
<img class="thumbnail" src="{{product.imageURL}}">
<div class="box-element product">
<h6><strong>{{product.name}}</strong></h6>
<hr>
<form name="sizeForm" id="id_sizeForm" action="" method="post">
{% csrf_token %}
<select id="id_size">
{% for size in sizes %}
<option value="{{ size.name }}">{{ size.name }}</option>
{% endfor %}
</select>
<input type="submit" value="Add to Cart" data-product="{{product.id}}" data-action="add" class="btn btn-outline-secondary add-btn update-cart">
</form>
<a class="btn btn-outline-success" href="#">View</a>
<h4 style="display: inline-block; float: right"><strong>${{product.price}}</strong></h4>
</div>
</div>
{% endfor %}
</div>
А это JS для обновления элемента при нажатии
var updateBtns = document.getElementsByClassName('update-cart')
var size = document.getElementById('id_size').value;
for (i = 0; i < updateBtns.length; i++) {
updateBtns[i].addEventListener('click', function(){
var productId = this.dataset.product
var action = this.dataset.action
console.log('productId:', productId, 'Action:', action, 'Size:', size)
console.log('USER:', user)
if (user == 'AnonymousUser'){
console.log('User is not authenticated')
}else{
updateUserOrder(productId, action, size)
}
})
}
function updateUserOrder(productId, action, size){
console.log('User is authenticated, sending data...')
var url = '/update_item/'
fetch(url, {
method:'POST',
headers:{
'Content-Type':'application/json',
'X-CSRFToken':csrftoken,
},
body:JSON.stringify({'productId':productId, 'action':action, 'size':size})
})
.then((response) => {
return response.json();
})
.then((data) => {
console.log('Data:', data)
});
}