У меня возникли проблемы с поиском хорошего решения для проверки формы, поля которой установлены в ее методе init .
Быстрое объяснение моих моделей: предполагается, что каждый продукт чтобы иметь вариации, причем каждый вариант в свою очередь имеет несколько вариантов VariationOptions.
- Каждый продукт может иметь несколько вариантов, например «Цвет» или «Материал»
- Вариации могут иметь несколько вариантов VariationOptions (ManyToMany -Relation), например 'red' или 'concrete'
При рендеринге AddToCartForm каждое Variation соответствует ChoiceField с VariationOptions, используемым в качестве выбора для указанного ChoiceField. (см. forms.py)
Поскольку каждый продукт может иметь разные варианты и, следовательно, разные поля, форма AddToCart должна генерироваться динамически из набора запросов, содержащего варианты продуктов (views.py), или как минимум вот о чём я думаю прямо сейчас.
Мои вопросы:
- Как я могу проверить такую форму?
- Видите ли вы лучший способ достижения та же идея?
Буду очень признателен за вашу помощь. Заранее спасибо!
Вот мой упрощенный код:
MODELS.PY
class Product(models.Model):
..
class Variation(models.Model):
name = models.CharField()
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='variations')
options = models.ManyToManyField(VariationOption, blank=True)
class VariationOption(models.Model):
value = CharField()
FORMS.PY
class AddToCart(forms.Form):
quantity = forms.PositiveIntegerField()
# for every variation get all its choices and add new ChoiceField to form
def __init__(self, variations, *args, **kwargs):
super(AddToCart, self).__init__(*args, **kwargs)
for variation in variations:
CHOICES = []
choices_list = list(variation.options.all())
for choice in choices_list:
CHOICES.append(tuple((choice.value, choice.value)))
self.fields[variation.name] = forms.ChoiceField(choices=CHOICES)
VIEWS.PY
def render_product(request):
...
variations = list(Variation.objects.prefetch_related('options').filter(product=product))
add_to_cart_form = AddToCartForm(variations=variations)
return render(...)
@require_POST
def add_to_cart_view(request):
form = AddToCartForm(request.POST) # This isn't working. I see why, but know no other way.
if form.is_valid():
....