gpt4 book ai didi

python - 动态 ChoiceField 无法在表单中进行验证

转载 作者:行者123 更新时间:2023-12-01 07:51:45 24 4
gpt4 key购买 nike

我有一个表单,它被赋予了选择字典,它正确填充它,但在表单提交时它无效。当尝试打印 errors, non_field_errors 时,只有空白。当我重定向到表单时,现在选择字段由一个选项和上一次提交的 csrf token 填充。

我尝试过以不同的方式分配选项,例如 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@email.io']}>
Non-field errors
Reg form errors
Field data {}
Field fields OrderedDict([('calendar', <django.forms.fields.ChoiceField object at 0x117323080>)]) Form is False

最佳答案

在您看来,您可以使用 request.POST 作为第一个位置参数来调用 CalendarSelectionForm 构造函数。这意味着您调用 __init__ 函数,并且 request.POST 作为 calendars 参数传递。

您可以通过使用命名参数构建表单来解决此问题。此外,您还需要将相同的参数传递给calendars,就像您使用 GET 请求呈现表单时所做的那样,否则选项本身不匹配,并且用户可能选择了一个选项在这种情况下,在 POST 请求期间可用。喜欢:

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

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

关于python - 动态 ChoiceField 无法在表单中进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com