#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
.