Как показать доступные размеры одежды на форме? Django
Я разрабатываю интернет-магазин одежды на Django. Сейчас я столкнулся с проблемой: У меня есть форма, которая помогает пользователю добавить в корзину одежду. Мне нужно показать, какие размеры этой одежды есть в наличии. Для этого мне нужно обратиться к базе данных. Но как это сделать из формы?
моя форма:
forms.py
from django import forms
PRODUCT_QUANTITY_CHOICES = [(i, str(i)) for i in range(1, 21)]
class CartAddProductForm(forms.Form):
quantity = forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES, coerce=int)
update = forms.BooleanField(required=False, initial=False, widget=forms.HiddenInput)
# size = ??
представление, которое использует эту форму:
views.py
def product_detail(request: WSGIRequest, product_id: int, product_slug: str) -> HttpResponse:
product = get_object_or_404(Product,
id=product_id,
slug=product_slug,
available=True)
cart_product_form = CartAddProductForm()
return render(request, 'shop/product/detail.html', {'product': product,
'cart_product_form': cart_product_form})
shop/product/detail.html:
{% extends "shop/base.html" %}
<head>
<meta charset="UTF-8">
<title>Detail</title>
</head>
<body>
{% block content %}
<br>
<b>{{ product.name }} </b> <br>
<i>{{ product.description }} </i> <br>
{{ product.price }} <br>
<img src="{{ product.image.url }}" width="300" height="500"> <br>
Available sizes: <br>
{{ product.sizes }}<br>
<form action="{% url "cart:add_to_cart" product.id %}" method="post">
{{ cart_product_form }}
{% csrf_token %}
<input type="submit" value="Add to cart">
</form>
{% endblock %}
</body>
Я попытался создать функцию, которая получает доступные размеры и отправляет их на форму:
forms.py
def get_sizes(product: Product):
return product.sizes
Но для этого мне нужно обратиться к продукту из формы, я не знаю, как это сделать.
Как насчет разделения каждой одежды по размеру (с количеством)? Одежда с разными размерами может рассматриваться как разный товар.
продукт
ID | name | image | description | price | ... |
---|---|---|---|---|---|
1 | jean | a.jpg | good jean | 12345 | ... |
size
ID | product_id | size | quantity | ... |
---|---|---|---|---|
1 | 1 | xxxl | 12345 | ... |
2 | 1 | xxl | 1234 | ... |
3 | 1 | xl | 123 | ... |
Если количество больше 0, то данный размер одежды имеется в наличии.
Мое решение:
forms.py
from django import forms
from django.forms import ModelForm
from shop.models import Product
class CartAddProductForm(ModelForm):
class Meta:
model = Product
fields = ['sizes']
def __init__(self, pk, *args, **kwargs):
super(CartAddProductForm, self).__init__(*args, **kwargs)
sizes = tuple(Product.objects.get(pk=pk).sizes)
sizes_list = []
for item in sizes:
sizes_list.append((item, item))
self.fields['sizes'] = forms.ChoiceField(choices=sizes_list)
когда я создаю форму, я передаю pk:
views.py
product = get_object_or_404(Product,
id=product_id,
slug=product_slug,
available=True)
pk = product.pk
cart_product_form = CartAddProductForm(instance=product, pk=pk)