python - Django 异常类型 : KeyError Exception Value: 'pk'

标签 python django keyerror

我可能在做一些愚蠢的事情,但无法弄清楚是什么,这让我发疯,因为它微不足道,而且我还有其他应用程序使用相同的逻辑。

所以我有一个模型客户和模型注释。每个客户我都可以创建很多Notes。 在 Notes 中,客户被定义为外键。

查看.py

@login_required
def note_new(request,pk):
    contact = get_object_or_404(Contacts, pk=pk)
    if request.method == "POST":
        form = NoteForm(request.POST)
        if form.is_valid():
            note = form.save(commit=False)
            note.pub_date = timezone.now()
            note.save()
            return redirect('contact_details',pk=contact.id)
    else:
        form = NoteForm(pk=contact.id)
    return render(request, 'customer/note_edit.html', {'form': form})

表单.py

class NoteForm(forms.ModelForm):
    class Meta:
        model = Note
        fields = [ 'title','body','contact' ]

    def __init__(self,*args,**kwargs):
        contact_id = kwargs.pop('pk')
        # self.fields['contact'].initial = contact_id
        super(NoteForm,self).__init__(*args,**kwargs)
        self.initial['contact'] = contact_id
        self.fields['contact'].widget.attrs['readonly'] = True

所以表单显示正常,在我点击保存后我得到了

KeyError at /customer/note/new/9 'pk' Request Method: POST Request URL: http://127.0.0.1:8000/customer/note/new/9 Django Version: 1.8 Exception Type: KeyError Exception Value:
'pk' Exception Location: C:\Users\I812624\dev\mrp\src\customer\forms.py in __init__, line 48 Python Version: 2.7.1

它应该将我重定向到显示联系信息的 contact_details,它会遍历所有 Notes。

contact_details.html

 {% for field in data.notes %}
    <tr>

       <td> {{ field }}</td>

    </tr>
    {% endfor %}

有什么建议吗?

谢谢。

最佳答案

@Shang 已经解释了为什么会出现错误以及如何修复它,所以我不再重复。我的回答是建议一种您认为不同的方法。

如果您不希望 contact 字段可编辑,最好将其从表单中排除。

class NoteForm(forms.ModelForm):
        class Meta:
            model = Note
            fields = [ 'title','body']

然后在你的 View 中,你可以设置保存后的联系人 commit=False

    if form.is_valid():
        note = form.save(commit=False)
        note.pub_date = timezone.now()
        note.contact = contact
        note.save()
        return redirect('contact_details', pk=contact.id)

现在您根本不必重写表单的 __init__ 方法。

如果要在模板中显示联系人,则将其包含在模板上下文中。

return render(request, 'customer/note_edit.html', {'form': form, 'contact': contact})

然后在模板中包含 {{ contact }}

关于python - Django 异常类型 : KeyError Exception Value: 'pk' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36139550/

相关文章:

python - docker中的多进程架构

django - 根据值设置字段的背景颜色

python - 无法从 Django sqlite3 数据库中删除项目,错误为 "foreign key constraint failed"

python - 迭代和类型错误: 'int' object is not iterable

python - Beautifulsoup 过滤器结果在 "for i"循环中引发 KeyError

python - 提高 KeyError(key) KeyError : 'SECRET_KEY' with django on production settings

python - Leptonica - 应用 otsu 阈值后无法写入图像

java - 将 python 列表返回给 Java

python - Django Form ChoiceField 在 View in Form initial 中设置选项

python - 管道发送和接收。 unpack 需要长度为 4 的字符串参数