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

2024-10-01 02:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样的表格

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

为什么我不能在我看来做以下事情?在

^{pr2}$

很明显,这是在一个迷你网店,我试图显示一个下拉选项,可能是或不存在的每个项目。如果没有选项,我想隐藏下拉列表

我设法用另一种方法来做,也就是说,我可以在模板中通过检查optionset是否存在(这是什么product.has\u选项,然后填充下拉列表。但这样一来,我必须在表单发布到购物车时将所选选项添加到表单中。简言之,我想知道是否有我不能做上述事情的原因。在

代码运行良好,但它不会隐藏没有选项的下拉列表。在


Tags: form表单列表sizevalue选项formsproduct
2条回答

嘿,我在shell/html中玩过了,看起来所有这些都应该可以工作了。在

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

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

看起来你可以直接编辑窗体.字段[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()在下面。在

好像你99%都在那里?在

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

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

还有其他方法可以做到这一点,但我认为闭包方式有助于实现最简洁的代码。在

相关问题 更多 >