Django中带前缀表单的键错误

2 投票
2 回答
2373 浏览
提问于 2025-04-16 20:17

我在一个页面上使用了两个表单(我有我的理由)。这两个表单不是模型表单。我想通过使用前缀来验证它们。我在这里找到了相关信息:在Django中处理一个页面上的多个表单的正确方法。但是当我尝试获取清理后的数据时,遇到了键错误。

add_form = AbsenceTypeForm(request.POST, prefix = 'atype')
if add_form.is_valid():
    absence_type = AbsenceType(
        client = client_instance,
        name = add_form.cleaned_data['type_name'],
        gainful = add_form.cleaned_data['gainful'],
    )
    absence_type.save()

我在处理 type_name 时得到了 KeyError。我尝试添加 cleaned_data['atype-type_name'],但没有任何帮助。

2 个回答

0

可能是你在提交的表单中把 type_name 留空了;cleaned_data 只会包含那些不为空的表单字段的内容。

2

你有没有想过把清理过的数据输出到屏幕上或者保存到文件里,这样可以检查一下它获取的键是什么?调试工具也应该能在局部变量中显示这个字典。我猜可能是前缀丢失或者拼写错误,或者是表单字段的名字不对。

顺便说一下,我同意使用 .get() 方法更安全(虽然看起来表单验证应该已经由 is_valid() 处理了,但你可能将来会决定把某个字段改为非必填,这样的话这段代码就会出错),所以:

name = add_form.cleaned_data.get('type_name',None),
gainful = add_form.cleaned_data.get('gainful',None),

if name and gainful:
    pass
    #rest of the code

撰写回答