无法在表单中验证动态ChoiceField

雅克

我有一个正在提供选择字典的表单,它正确填充了表单,但在表单提交时无效。尝试打印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.POSTcalendars

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

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

my_calendars在GET情况下构造表单时传递的值相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章