如果我有这样的表格
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()所做的)在模板中执行此操作,然后在该点填充下拉列表。但这样我必须处理将所选选项添加到表单中,因为它被发布到购物车。简而言之,我想知道我是否有理由不能做到这一点。
代码运行正常,但它没有隐藏没有选项的下拉列表。
答案 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>
元素。
我认为您禁用它的选项是:
form.fields['myfield'].widget.attrs['styles'] = 'display:none;'
del form.fields['myfield']
{% if product.get_options %}{{ field }}{% endif %}
好像你在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=':')
还有其他方法可以做到这一点,但我认为封闭方式可以实现最新的代码。