You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可。

其他可优化问题

  1. 现有代码中return render(request, 'kod.html', {'kod': kod})缩进错误,放在了except分支的return之后,永远不会被执行
  2. 代码中的>是HTML转义字符,需要替换为原生的>符号
  3. 加密逻辑中的常量klucz可以提到循环外赋值,避免重复生成
  4. 现有处理逻辑仅将结果打印在控制台,没有存入变量返回给模板,需要补充结果拼接逻辑

修正后参考代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:57:04