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

#python #django #django-forms

Вопрос:

в моем проекте 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>
 

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

Комментарии:

1. Что не работает? Выдает ли он ошибку или просто не отображает то, что вы ожидаете?

2. форма не отображается в шаблоне. Спасибо!

3. Вы все еще хотите использовать FormView ? Я не очень хорошо знаком с FormView этим , но я знаком с простым View и другими типами взглядов.

Ответ №1:

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

Вместо:

 form_class = CartAddProductRetailForm
 

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

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

Ответ №2:

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