Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法在表单中验证动态选择字段_Python_Django_Django Forms - Fatal编程技术网

Python 无法在表单中验证动态选择字段

Python 无法在表单中验证动态选择字段,python,django,django-forms,Python,Django,Django Forms,我有一个表单,它被提供了一个选择字典,它正确地填充了它,但是在表单提交上它是无效的。当试图打印错误时,非字段错误只有空格。当我被重定向到表单时,现在选项字段由一个选项和上一次提交的csrf令牌填充 我尝试过以不同的方式分配选项,例如self.fields['calendar']=forms.ChoiceField(choices=choice\u list)以不同的方式直接分配self.fields['calendar'].choices=choice_list,一个忽略验证的自定义验证器,以及

我有一个表单,它被提供了一个选择字典,它正确地填充了它,但是在表单提交上它是无效的。当试图打印
错误时,非字段错误
只有空格。当我被重定向到表单时,现在选项字段由一个选项和上一次提交的csrf令牌填充

我尝试过以不同的方式分配选项,例如
self.fields['calendar']=forms.ChoiceField(choices=choice\u list)
以不同的方式直接分配
self.fields['calendar'].choices=choice_list
,一个忽略验证的自定义验证器,以及内联调试

表格模型:

class CalendarSelectionForm(forms.Form):
calendar=forms.ChoiceField(label=“calendar”)
定义初始化(self,日历=None,*args,**kwargs):
超级(CalendarSelectionForm,self)。\uuuuuuuuuuuuuuu初始值(*args,**kwargs)
calendar.items()中calendar\u id、calendar\u name的选项\u list=[(calendar\u id、calendar\u name)
如果日历:
self.fields['calendar'].choices=选项列表
视图:

if request.method==“POST”:
打印(请求.发布)
cal\u sync\u form=CalendarSelectionForm(request.POST)
打印(“非字段错误”+str(校准同步表单。非字段错误()))
打印(“注册表单错误”+str(校准同步表单错误))
#打印(“字段值”+str(校准同步表格日历))
打印(“字段数据”+str(校准同步表格数据))
打印(“字段字段”+str(校准同步表单字段)+“表单为”+str(校准同步表单有效()))
如果校准同步表单有效():
数据=校准同步表格。已清理数据
打印(数据)
返回渲染(请求“management/gcal\u sync\u dashboard.html”)
其他:
返回呈现(请求'management/acct_select.html',{'form':cal_sync_form})
表单模板:


{%csrf_令牌%}
{{form.calendar}}
{{form.errors}}
{{form.non_field_errors}}
目标是验证已发布的表单,并打印当前的打印语句

<QueryDict: {'csrfmiddlewaretoken': ['sJHE8JJAzmeS0nRjaYZg5KdMlevJiInYY0G4YFJeITH1cVjciIdR1Dq1N28loUIL'], 'calendar': ['email@email.io']}>
Non-field errors 
Reg form errors 
Field data {}
Field fields OrderedDict([('calendar', <django.forms.fields.ChoiceField object at 0x117323080>)]) Form is False

非字段错误
注册表格式错误
字段数据{}
字段字段OrderedDict([('calendar',)])表单为False

在您的视图中,您使用
request.POST
作为第一个位置参数调用
CalendarSelectionForm
构造函数。这意味着您调用
\uuu init\uuu
函数,
request.POST
作为
日历
参数传递

您可以通过使用命名参数构造表单来解决此问题。此外,您还需要向
日历
传递与使用GET请求呈现表单时相同的参数,因为否则选项本身不匹配,并且用户可能选择了在这种情况下在POST请求期间不可用的选项。比如:

if request.method == 'POST':
    cal_sync_form = CalendarSelectionForm(calendars=my_calendars, data=request.POST)
    # ...
if request.method==“POST”:
cal_sync_form=CalendarSelectionForm(calendars=my_calendars,data=request.POST)
#…

使用
my_calendars
与您在GET案例中构建表单时传递的值相同。

您需要在
表单
中填充
日历,因为您基本上构建了一个“新”日历POST调用中的表单。我填充日历,如
form=CalendarSelectionForm(calendars=calendars\u dict)
,当尝试执行相同操作时,它会说
\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuu()已被赋予太多的值
,您应该使用
CalendarSelectionForm(calendars=calendars\u dict,data=request.POST)
,创建
日历选择表单,现在您将
请求传递。将
作为您的
日历发布到表单中。解决方案奏效了,这就是问题所在。作为一个附带问题,表单是否没有将可用选项和所选选项传递给表单?@Jacq:Django中的
form
用于最终呈现HTML(以及执行验证)。虽然这些选项出现在HTML中,但如果发出POST请求,这些选项不会出现在POST数据中,因此Django无法基于POST请求“重建”一个
表单,因此没有;这些数据通常会“消失”。