Django迭代Model Form保存结果时提示'Passwords'对象不可迭代错误
Django模型表单迭代报错问题排查
错误根因
调用password_form.save()方法后返回的是Passwords模型的实例对象,而非你要迭代的text字段内容,直接对模型实例执行循环操作,就会触发'Passwords' object is not iterable类型错误。
修复方案
你可以根据业务需求二选一修改:
- 如果需要先将表单数据落库,再处理内容,将迭代代码修改为对模型实例的
text属性循环:
把for i in text:替换为for i in text.text: - 如果不需要立即落库,优先处理提交的文本,可直接从表单清理后的数据中取值,无需先调用save:
在password_form.is_valid()判断后新增text_content = password_form.cleaned_data['text'],后续循环迭代text_content即可。
其他可优化问题
- 现有代码中
return render(request, 'kod.html', {'kod': kod})缩进错误,放在了except分支的return之后,永远不会被执行 - 代码中的
>是HTML转义字符,需要替换为原生的>符号 - 加密逻辑中的常量
klucz可以提到循环外赋值,避免重复生成 - 现有处理逻辑仅将结果打印在控制台,没有存入变量返回给模板,需要补充结果拼接逻辑
修正后参考代码
def start(request): password_form = PasswordsForm(request.POST or None) if password_form.is_valid(): text_content = password_form.cleaned_data['text'] kod = "" klucz = 10 try: for i in text_content: value = alphabet[i] new_value = int(value) + klucz if new_value > 70: new_value = new_value - 70 for key, val in alphabet.items(): if val == str(new_value): kod += key # 处理完成后落库 pwd_instance = password_form.save(commit=False) pwd_instance.cipher = kod pwd_instance.save() return render(request, 'kod.html', {'kod': kod}) except KeyError as e: err_msg = f'Nie znaleziono wartości {e} w słowniku!' return render(request, 'start.html', { 'password_form': password_form, 'error': err_msg }) return render(request, 'start.html', {'password_form': password_form})
内容的提问来源于stack exchange,提问作者Natalia Osysko
相关产品推荐
相关产品推荐

