Как показать доступные размеры одежды на форме? 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)
Вернуться на верх