Django视图函数访问form.cleaned_data异常问题求助
Django注册表单中
form.cleaned_data为空的问题解答 问题描述
我在开发带注册表单的Django项目时碰到个问题:两段功能看似一致的代码,访问form.cleaned_data的结果却不一样。
代码片段1
def signup(req): if req.method == 'POST': form = RegisterForm(req.POST) if form.is_valid(): messages.success(req, 'Account Created successfully') form.save() print(form.cleaned_data) return render(req, 'signup.html', {'form': form}) else: form = RegisterForm() return render(req, 'signup.html', {'form': form})
代码片段2
def signup(req): if req.method == 'POST': form = RegisterForm(req.POST) if form.is_valid(): messages.success(req, 'Account Created successfully') form.save() print(form.cleaned_data) return render(req, 'signup.html', {'form': form}) form = RegisterForm() return render(req, 'signup.html', {'form': form})
用片段1时能正常获取并打印form.cleaned_data,但用片段2时form.cleaned_data是空的,我已经检查过没有拼写错误,想知道差异的原因。
问题原因
核心差异在于代码执行流程的不同:
- 片段1中,当
req.method == 'POST'但form.is_valid()不成立时,会直接进入else分支,返回全新的空表单,不会执行到打印cleaned_data的逻辑——只有当form.is_valid()为True时,才会执行打印操作,此时表单已通过校验,cleaned_data自然有值。 - 片段2中,当
req.method == 'POST'但form.is_valid()不成立时,不会触发return,会继续执行后续的form = RegisterForm()语句,把之前带POST数据的表单实例覆盖成了全新的空表单。此时打印的是这个新空表单的cleaned_data,而空表单未经过校验,所以cleaned_data为空。
修复方案
正确的写法应该保留校验失败的原表单实例,而不是重新创建空表单,示例如下:
def signup(req): form = RegisterForm() if req.method == 'POST': form = RegisterForm(req.POST) if form.is_valid(): messages.success(req, 'Account Created successfully') form.save() print(form.cleaned_data) return render(req, 'signup.html', {'form': form}) # GET请求或POST校验失败时,返回当前的form实例(带错误信息或空表单) return render(req, 'signup.html', {'form': form})
内容的提问来源于stack exchange,提问作者romjan
相关产品推荐
相关产品推荐

