调用Django Form将ChoiceField选项设置为Form

时间:2013-06-30 16:27:50

标签: 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 = 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.

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

2 个答案:

答案 0 :(得分:11)

处理完请求后,您的用户输入似乎会使用硬编码值进入未经修改的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)

答案 1 :(得分: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