Django表单设置ChoiceField选项作为调用表单

Django表单设置ChoiceField选项作为调用表单,django,python-2.7,django-forms,Django,Python 2.7,Django Forms,我正在尝试与库存应用程序集成,并允许用户通过Django表单向库存中添加零件。我可以从库存数据库中读取数据,但必须通过API进行写入,因此根据他们输入的数据,我想给他们一个可添加的可用零件列表 这是我的表格,我设置了一些选项作为默认值: class PartForm(forms.Form): PART_CHOICES = ( ('BT-J1KND-A', 'BT-J1KND-A'), ('BT-J1KND-B', 'BT-J1KND-B'),) part = fo

我正在尝试与库存应用程序集成,并允许用户通过Django表单向库存中添加零件。我可以从库存数据库中读取数据,但必须通过API进行写入,因此根据他们输入的数据,我想给他们一个可添加的可用零件列表

这是我的表格,我设置了一些选项作为默认值:

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
它在模板中正确显示,但当我点击save并处理表单时,如果它不是我输入的默认选项之一,则表示它不是有效选项

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

如何修复此问题以使其接受我设置为有效选项的选项?

如果以编程方式更改窗体上的某个字段,我相信您需要在以后调用窗体上的
full\u 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

,一旦请求得到处理,您的用户输入似乎进入了未修改的
部分形式,使用了硬编码值

为了正确处理请求,您需要有一个一致的
PartForm

通过在初始化时修改字段的
选项
属性,可以顺利实现这一点

例如:

类示例表单(forms.Form):
选择=(
('EXMPL','Example'),
)
field=forms.ChoiceField(选项=choices,必需=True,label='Example')
def uuu init uuuu(self,custom_choices=None,*args,**kwargs):
super(例如表单,self)。\uuuuuu初始化(*args,**kwargs)
如果是自定义的(u)选项:
self.fields['field'].choices=自定义选项
然后,记住正确初始化表单,使用

form=ExampleForm(我的自定义选项嵌套元组…)


您还可以仔细检查实际处理数据的位置(我猜,复制的代码中没有提到a
form=PartForm(request.request)

大约有多少个部件选项?这消除了一个错误,但现在我在处理数据时出现了值错误。ValueError太多值无法解包突出显示的行是模板行,我在模板行中显示了{{form.as_p}}哦,只是为了澄清一下,选择被作为元组列表传递到表单中,所以我不知道问题到底出在哪里
form=PartForm(request.POST)
if form.is\u valid():
always Fails在验证过程中出错后,终于让它正常工作了。谢谢!这也消除了验证错误,但现在我有一个ValueError,太多的值需要解压。有趣的是,我们在一个应用程序中工作良好,将在上面粘贴一些示例代码,以便您可以看到我们的解决方案与您的不同。当我在POST请求中找到有效值时,问题就出现了,它总是返回False。。。。