指定选项以在显示时选择下拉列表

时间:2010-12-12 12:24:08

标签: python django django-models django-forms

如果我有这样的表格

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"
显而易见的是,这是在一个minishop,我试图显示每个项目可能存在或可能不存在的选项下拉。如果没有optinos我想隐藏下拉列表

我已经设法以不同的方式执行此操作,即我可以通过检查选项集是否存在(这是product.has_options()所做的)在模板中执行此操作,然后在该点填充下拉列表。但这样我必须处理将所选选项添加到表单中,因为它被发布到购物车。简而言之,我想知道我是否有理由不能做到这一点。

代码运行正常,但它没有隐藏没有选项的下拉列表。

2 个答案:

答案 0 :(得分:1)

嘿那里,我在shell / html中玩过,看起来这一切都应该有效。

看起来你可以做你发布的内容。

你说你不确定如何在视图中分配选项?我测试了你的代码,看起来它有效吗? form.fields[myfield] = forms.NewField()正确修改了下一次表单显示调用。

看起来你也可以直接编辑forms.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. 哦,我看到你可以在下面使用forms.HiddenInput()。
  5. 好像你在99%的路上?

答案 1 :(得分:0)

我会在视图中创建一个动态表单作为闭包,类似这样(完全未经测试)

def my_view(request, ...):
    product = ...
    if product.has_options():
        product_widget = forms.Select(choices=product.get_options())
    else: 
        product_widget = forms.HiddenInput()
    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=product_widget)
        product_slug = forms.CharField(widget=forms.HiddenInput())
    form = ProductAddToCartForm(request=request, label_suffix=':')

还有其他方法可以做到这一点,但我认为封闭方式可以实现最新的代码。