назначить выбор, чтобы выбрать раскрывающийся список во время отображения - PullRequest
1 голос
/ 12 декабря 2010

если у меня есть такая форма

class ProductAddToCartForm(forms.Form):
    quantity = forms.IntegerField(widget=forms.TextInput(attrs={'size':'2', 'value':'1', 'class':'quantity', 'maxlength':'5'}), error_messages={'invalid':'Please enter a valid quantity.'}, min_value=1)
    size_option = forms.ChoiceField(widget=forms.Select(choices=()))
    product_slug = forms.CharField(widget=forms.HiddenInput())

почему я не могу сделать следующее, на мой взгляд?

    form = ProductAddToCartForm(request=request, label_suffix=':')
    if product.has_options():
        Prod_Choices = product.get_options()
        form.fields['size_option'] = forms.ChoiceField(widget=forms.Select(choices=Prod_Choices))
    else: 
        form.fields['size_option'].widget.attrs['type'] = "hidden"

очевидное использование этого вМини-магазин, где я пытаюсь показать раскрывающийся список опций, которые могут присутствовать или не присутствовать для каждого элемента.если нет оптино, я хочу скрыть раскрывающийся список

Мне удалось сделать это по-другому, то есть я могу сделать это в шаблоне, проверив наличие набора опций (что и является product.has_options() и затем заполняет раскрывающийся список в этой точке.но таким образом мне приходится иметь дело с добавлением выбранных опций в форму, когда она попадает в корзину.Короче говоря, я хочу знать, если есть причина, почему я не могу сделать выше.

код работает нормально, но он не скрывает раскрывающийся список, где нет параметров.

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Привет, я поигрался в shell / html и похоже, что все это должно работать.

Похоже, вы можете делать то, что вы отправили.

Вы сказали, что не знаете, как назначить выбор в представлении? Я проверил ваш код, и, похоже, он работает? form.fields[myfield] = forms.NewField() правильно изменяет следующий вызов для отображения формы.

Похоже, вы также можете напрямую редактировать атрибут form.fields [myfield] .choices.

class MyForm(forms.Form):
    myfield = forms.ChoiceField(choices=[(x, x+1) for x in range(3)])

# hmm choices is an interesting attribute
>>> form.fields['myfield'].choices
[(0, 1), (1, 2), (2, 3)]

>>> form.fields['myfield'].choices = [('New', 'Choice') for x in range(3)]
>>> form.as_p()
<output reflecting new choices>

Что касается отключения поля:

Ваш код для его отключения не работает, потому что type='hidden' не применяется к <select> элементам.

Я думаю, что вы можете отключить его:

  1. Скрыть поле. form.fields['myfield'].widget.attrs['styles'] = 'display:none;'
  2. Удалить поле. del form.fields['myfield']
  3. Выберите, чтобы оно не отображалось в шаблоне. {% if product.get_options %}{{ field }}{% endif %}
  4. О, я вижу, что вы можете использовать формы. Скрытый вход () ниже.

Похоже, вы прошли 99% пути?

0 голосов
/ 12 декабря 2010

Я бы сделал динамическую форму в качестве замыкания в представлении, что-то вроде этого (полностью непроверенное)код.

...