这是我的型号
class Variation(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE,
related_name="product_variation")
name = models.CharField(max_length=50)
这是我的表格:
class CartAddProductForm(forms.Form):
quantity = forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES, coerce=int, label=_('Quantity'),widget=forms.NumberInput(attrs={'class': 'form-control text-center'}))
variation_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['variation_select'].queryset = Variation.objects.filter(i want to filter there by foreign key, product_id=product_id)
这是我的观点:
def cart_add(request, product_id):
cart = Cart(request)
product = get_object_or_404(Product, id=product_id)
form = CartAddProductForm(request.POST or None)
if form.is_valid():
cd = form.cleaned_data
cart.add(product=product, quantity=cd['quantity'],)
return redirect('cart:cart_detail')
我想按产品筛选变化,有什么建议吗?
您可以将product_id
作为参数传递到表单:
class CartAddProductForm(forms.Form):
quantity = forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES, coerce=int, label=_('Quantity'),widget=forms.NumberInput(attrs={'class': 'form-control text-center'}))
variation_select = forms.ModelMultipleChoiceField(queryset=Variation.objects.none())
def __init__(self, *args, product_id=None, **kwargs):
super().__init__(*args, **kwargs)
if product_id is not None:
self.fields['variation_select'].queryset= Variation.objects.filter(
product_id=product_id
)
然后在视图中,我们可以将product_id
传递给GET和POST请求的表单:
def cart_add(request, product_id):
cart = Cart(request)
product = get_object_or_404(Product, id=product_id)
if request.method == 'POST':
form = CartAddProductForm(request.POST, post_id=post_id)
if form.is_valid():
cd = form.cleaned_data
cart.add(product=product, quantity=cd['quantity'],)
return redirect('cart:cart_detail')
else:
form = CartAddProductForm(post_id=post_id)
# …