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请求“重建”一个表单,因此没有;这些数据通常会“消失”。