изменить представление на основе функций в представлении на основе классов для обработки «запроса» формы - PullRequest
0 голосов
/ 11 июля 2019

Я следую учебному пособию, в котором сделана корзина для обработки товаров.Это функция для добавления товаров в корзину как

@require_POST
def cart_add(request, product_id):
    cart = Cart(request)
    product = get_object_or_404(Product, id=product_id)
    form = CartAddProductForm(request.POST)

    if form.is_valid():
        cd = form.cleaned_data
        cart.add(product=product, quantity=cd['quantity'], update_quantity=cd['update'])

    return redirect('cart:cart_detail')

, а вторая -

def product_detail(request, id, slug):    
    product = get_object_or_404(Product, id=id, slug=slug, available=True)
    cart_product_form = CartAddProductForm()
    return render(request,'shop/product/detail.html' {'product':product,'cart_product_form': cart_product_form})

Как я могу изменить эти два кода в ClassBasedViews?Что будет лучше?используя те же функции на основе представлений или ClasBased?

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)

это forms.py в CartApp.У корзины есть класс с именем Cart, который требует request,Product из формы.Как я могу передать эту информацию в корзину, используя CBV?

1 Ответ

0 голосов
/ 12 июля 2019

Немного сложно визуализировать все шаги на этом пути, но я думаю, что это дает вам хотя бы отправную точку (если это не решит вашу проблему). Ваши 2 функциональных представления могут быть заменены одним классовым представлением. Единственное, что вам следует знать, это то, что в вашем шаблоне ваша форма теперь доступна под именем form вместо cart_product_form.

class AddCartFormView(FormView):
    template_name = 'shop/product/detail.html'
    form_class = CartAddProductForm()

    def get_success_url(self):
        return reverse('cart:cart_detail')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Your form is already inside context by the name of "form"
        context = ['product'] = get_object_or_404(Product, id=product_id, slug=slug, available=True)
        return context

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        cart = Cart(request)
        product = get_object_or_404(Product, id=kwargs.get('product_id'))

        if form.is_valid():
            cd = form.cleaned_data
            cart.add(product=product, quantity=cd['quantity'], update_quantity=cd['update'])
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
...