выбор набора запросов формы django

#django #django-models #django-views #django-forms #django-templates

Вопрос:

это моя модель

 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')
 

я хочу отфильтровать варианты по продуктам, есть какие-нибудь предложения?

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

1. Пожалуйста, поделитесь представлением , в котором вы используете эту форму.

2. @willemVanOnsem готово

Ответ №1:

Вы можете передать 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)
    # … 

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

1. имя ‘product_id’ не определено

2. @GuianaAnnimali: вы изменили параметры __init__ метода формы? Пожалуйста, отредактируйте вопрос с полной обратной записью формы.

3. да, теперь я добавил, но у меня есть еще одна ошибка, ошибка типа: __init__() отсутствует 1 требуемый позиционный аргумент: «набор запросов», я пытаюсь добавить, чтобы добавить набор запросов=Нет, я получил эту ошибку= «Нетип» объект не имеет атрибута «_prefetch_related_lookups»,

4. @GuianaAnnimali: см. Редактирование для инициализации variation_select .