【问题标题】:Django MultipleChoiceField restrictions on choices tupleDjango MultipleChoiceField 对选择元组的限制
【发布时间】:2015-05-05 16:32:33
【问题描述】:

当我尝试将 MultipleChoiceField 与 CheckboxSelectMultiple 小部件一起使用时,我收到一条错误消息。我使用 Django 的 MultipleChoiceField 构建了一个表单,该表单显示一组复选框供用户选择:

class CheckBoxForm(forms.Form):
def __init__(self,*args,**kwargs):
    arg_list = kwargs.pop('arg_list')
    section_label = kwargs.pop('section_label')
    super(CheckBoxForm,self).__init__(*args,**kwargs)
    self.fields['box_ID'].choices=arg_list
    print arg_list
    self.fields['box_ID'].label=section_label

box_ID = forms.MultipleChoiceField(required=True, widget=forms.CheckboxSelectMultiple)

视图如下所示:

sat_list = (
    ('a','SAT1'),
    ('b','SAT2')
    )

if request.method == 'POST':

    form_scID = CheckBoxForm(request.POST,arg_list=sat_list,section_label="Please Select Satelites")

    if form_scID.is_valid():
        scID = form_scID.cleaned_data['box_ID']

    return HttpResponse("Satellite: {sat}".format(sat=scID,type=taskType))

else:
    form_scID = CheckBoxForm(arg_list=sat_list,section_label="Please Select Satelites")

return render(request, 'InterfaceApp/schedule_search.html', {'form3': form_scID})

当我尝试这个时,我得到了错误:在赋值之前引用了局部变量“scID”,但是当我使用数字作为第一个元素设置选择元组时它可以工作,如下所示:

sat_list = (('1','SAT1'),('2','SAT2'))

为什么我必须将第一个元素设置为数字才能工作?

【问题讨论】:

  • 检查缩进。如此处所示,即使表单无效,您也将尝试构建并返回 HttpResponse 对象。在这种情况下,从未分配过scID,从而导致出现异常。这可能不是您唯一的错误,但这是首先要解决的问题。您也不要在此处显示的代码中为 taskType 分配任何内容,或者在格式字符串中尊重它。

标签: django django-forms django-widget


【解决方案1】:

表单不必是唯一的。调用时可以为表单指定前缀:

form_1 = DataTypeForm(request.POST or None,initial_value=True,prefix="1")
form_2 = DataTypeForm(request.POST or None,initial_value=False,prefix="2")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多