我有一个正在提供选择字典的表单,它正确填充了表单,但在表单提交时无效。尝试打印errors, non_field_errors
时只有空白。当我重定向到表单时,现在选择字段由一个选择和先前提交的csrf令牌填充。
我尝试以不同的方式分配选择,例如以不同的方式self.fields['calendar'] = forms.ChoiceField(choices=choice_list)
直接分配。self.fields['calendar'].choices = choice_list
,忽略验证的自定义验证器和内联调试。
表格模型:
class CalendarSelectionForm(forms.Form):
calendar = forms.ChoiceField(label="Calendar")
def __init__(self, calendars=None, *args, **kwargs):
super(CalendarSelectionForm, self).__init__(*args, **kwargs)
choice_list = [(calendar_id, calendar_name) for calendar_id, calendar_name in calendars.items()]
if calendars:
self.fields['calendar'].choices = choice_list
视图:
if request.method == "POST":
print(request.POST)
cal_sync_form = CalendarSelectionForm(request.POST)
print("Non-field errors " + str(cal_sync_form.non_field_errors()))
print("Reg form errors " + str(cal_sync_form.errors))
# print("Field val " + str(cal_sync_form.calendar))
print("Field data " + str(cal_sync_form.data))
print("Field fields " + str(cal_sync_form.fields) + " Form is " + str(cal_sync_form.is_valid()))
if cal_sync_form.is_valid():
data = cal_sync_form.cleaned_data
print(data)
return render(request, 'management/gcal_sync_dashboard.html')
else:
return render(request, 'management/acct_select.html', {'form': cal_sync_form})
表单模板:
<form class="form-import" action="/manage/gcal/sync/" method="post" id = "">
{% csrf_token %}
{{ form.calendar }}
{{ form.errors }}
{{ form.non_field_errors }}
<div class="push clearfix"></div>
<div class="col-sm-6 no-pad push"><input class="btn btn-brand btn-little button filson push-half" type="submit" value="Select email"><i class="fa fa-plus"></i></input>
</div>
</form>
目的是验证已过帐的表单,打印当前的打印报表
<QueryDict: {'csrfmiddlewaretoken': ['sJHE8JJAzmeS0nRjaYZg5KdMlevJiInYY0G4YFJeITH1cVjciIdR1Dq1N28loUIL'], 'calendar': ['[email protected]']}>
Non-field errors
Reg form errors
Field data {}
Field fields OrderedDict([('calendar', <django.forms.fields.ChoiceField object at 0x117323080>)]) Form is False
在您看来,您将第一个位置参数作为CalendarSelectionForm
构造函数的调用。因此,这意味着您调用该函数,并作为参数传递。request.POST
__init__
request.POST
calendars
您可以通过使用命名参数构造表单来解决此问题。此外,您将需要传递calendars
与使用GET请求呈现表单时相同的参数,因为否则选项本身将不匹配,并且用户可能选择了在这种情况下无法使用的选项。POST请求。喜欢:
if request.method == 'POST':
cal_sync_form = CalendarSelectionForm(calendars=my_calendars, data=request.POST)
# ...
与my_calendars
在GET情况下构造表单时传递的值相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句