在 Class 表单 "request" 处理的基于视图中更改基于函数的视图
change function based view in Class Based View for Form "request" handling
我正在学习一个教程,其中制作了用于处理产品的购物车。这是一个将商品添加到购物车的功能
@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?什么会更好?使用相同的基于功能的视图或基于类的视图?
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)
这是 CartApp 中的 forms.py
。购物车有一个名为 Cart
的 class,它需要表单中的 request,Product
。我如何使用 CBV 将该信息传递到购物车?
可视化整个过程的所有步骤有点困难,但我认为这至少为您提供了一个起点(如果它不能解决您的问题)。
您的 2 个基于函数的视图可以替换为一个基于 class 的视图。您唯一应该注意的是,在您的模板上,您的表单现在可以通过名称 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)
我正在学习一个教程,其中制作了用于处理产品的购物车。这是一个将商品添加到购物车的功能
@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?什么会更好?使用相同的基于功能的视图或基于类的视图?
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)
这是 CartApp 中的 forms.py
。购物车有一个名为 Cart
的 class,它需要表单中的 request,Product
。我如何使用 CBV 将该信息传递到购物车?
可视化整个过程的所有步骤有点困难,但我认为这至少为您提供了一个起点(如果它不能解决您的问题)。
您的 2 个基于函数的视图可以替换为一个基于 class 的视图。您唯一应该注意的是,在您的模板上,您的表单现在可以通过名称 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)