Как превратить функцию в класс и передать форму в Django?

В моем проекте Django есть функция:


def retail_product_detail(request, slug):
    context = {
        'product_retail': get_object_or_404(Product, slug=slug),
        'cart_product_form': CartAddProductRetailForm(),
        'related_products': Product.objects.filter(category__slug=self.kwargs['slug'])
        }
    return render(request, 'retail/single_product_retail.html', context)

как я могу превратить его в класс RetailProductDetail и передать форму для отображения?

я пытался:


class RetailProductDetail(FormView):

    template_name = 'retail/single_product_retail.html'
    context_object_name = 'product_retail'
    form_class = CartAddProductRetailForm

    def get_queryset(self):
        return Product.objects.filter(category__slug=self.kwargs['slug'])

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['product_retail'] = Product.objects.get(slug=self.kwargs['slug'])
        context['related_products_1'] = Product.objects.select_related('tag').all()
        return context

Но форма не работает.

В шаблоне:

<form action="{% url 'cart_add_retail' slug=product_retail.slug %}" method="post">
    {{ cart_product_form }}
    {% csrf_token %}
    <br>
    <input class="btn btn-outline-dark flex-shrink-0" type="submit" value="Add to cart>
</form>

Как я могу это исправить?

Я смог решить эту проблему следующим образом:

Вместо:

form_class = CartAddProductRetailForm

Я использовал:

    def get_context_data(self, *, object_list=None, **kwargs):
        context['cart_product_form'] = CartAddProductRetailForm

это потому, что в FormView CBV имя контекста по умолчанию для формы form попробуйте в шаблоне {{ form }}

Вернуться на верх