2013-06-30 105 views
5

我试图与库存应用程序集成,并允许用户通过Django表单添加零件到库存。我可以从库存数据库中读取数据,但必须通过API编写,以便根据他们输入到以前的表单中的内容,我想给他们一个可添加的可用部分列表。Django表单设置ChoiceField选项作为表单被称为

这里是我的表,我设置了几个选择,就像默认:

class PartForm(forms.Form): 
    PART_CHOICES = (
    ('BT-J1KND-A', 'BT-J1KND-A'), 
    ('BT-J1KND-B', 'BT-J1KND-B'),) 
    part = forms.ChoiceField(choices = PART_CHOICES,required = True, label = 'Part to add to Inventory') 

这里是我设置的选择

parts_list = part_sql(part) 
#build choices 
PART_CHOICES= [(p[0],p[0]) for p in parts_list] 
form = PartForm() 
form.fields['part'].choices = PART_CHOICES 

它正确地显示在模板但是当我去保存并处理表单,如果它不是我放入其中的默认选项之一,则表示它不是有效的选项。

Select a valid choice. BT-J1KND-C is not one of the available choices. 

我该如何解决这个问题,让它接受我设置的有效选项?

+0

大约有多少部分选择? –

+0

最多也就是6 – enderv

回答

10

处理完请求后,您的用户输入似乎会使用硬编码值进入未修改的PartForm

为了得到要求正确处理,就需要有一个一致的PartForm

您可以通过在初始化修改字段的choices属性顺利实现这一目标。

例如:

class ExampleForm(forms.Form): 
    CHOICES = (
     ('EXMPL', 'Example'), 
    ) 
    field = forms.ChoiceField(choices=CHOICES, required=True, label='Example') 

    def __init__(self, custom_choices=None, *args, **kwargs): 
     super(ExampleForm, self).__init__(*args, **kwargs) 
     if custom_choices: 
      self.fields['field'].choices = custom_choices 

然后,只记得正确初始化形式,

form = ExampleForm(my_custom_choices_nested_tuple, ...)

您也可以仔细检查,你实际上是在处理数据( form = PartForm(request.REQUEST)没有在您复制的代码中提到,我猜)

+0

这样摆脱了一个错误,但是现在我尝试处理数据时出现了值错误。 ValueError太多的值来解压突出显示的行是模板行,我显示的{{form.as_p}} – enderv

+0

哦,只是为了澄清选择正在传递到形式作为元组列表,所以我不知道在哪里问题恰好在于 – enderv

+0

'form = PartForm(request。POST)''如果form.is_valid():'总是失败 – enderv

0

如果以编程方式更改窗体上的一个字段,我相信您需要在窗体上调用full_clean(),以便将更改反映到窗体中。我们在一个应用程序上执行此操作 - 这里是我们为您的示例修改的代码。

from django.forms import Select 

... 

field = form.fields['part'] 
field.choices = PART_CHOICES 
field.widget = Select(choices=PART_CHOICES) 

form.fields['part'] = field 
form.full_clean() 

注意,以及分配field.choices,我们也重新初始化field.widget

+0

这也是摆脱了验证错误,但现在我有一个ValueError太多的值来解压 – enderv

+0

有趣的是,我们有一个在我们的应用程序中正常工作,将粘贴上面的一些示例代码,所以你可以看看我们的解决方案与你的不同之处 – robjohncox

+0

非常感谢 – enderv

相关问题