Django异常类型:KeyError异常值:'pk'

时间:2016-03-21 19:06:13

标签: python django keyerror

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

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

view.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})

forms.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

因此表单显示确定,点击“保存后”即可

  

/ customer / note / new / 9的KeyError   'PK'   请求方法:POST   请求网址:http://127.0.0.1:8000/customer/note/new/9   Django版本:1.8   异常类型:KeyError   例外价值:
  'PK'   异常位置:__init__,第48行中的C:\ Users \ I812624 \ dev \ mrp \ src \ customer \ forms.py   Python版本:2.7.1

它应该将我重定向到contact_details,其中显示联系信息并且它遍历所有Notes。

contact_details.html

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

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

    </tr>
    {% endfor %}

有什么建议吗?

谢谢。

2 个答案:

答案 0 :(得分:6)

@Shang已经解释了为什么你会收到错误以及如何解决它,所以我不会重复这个。我的答案是在你看来建议一种不同的方法。

如果您不希望if UIColor.respondsToSelector("_systemDestructiveTintColor") { if let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue() as? UIColor { // use the color } } 字段可编辑,最好将其从表单中排除。

contact

然后在您看来,您可以使用class NoteForm(forms.ModelForm): class Meta: model = Note fields = [ 'title','body']

保存后设置联系人
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__,请将其包含在模板上下文中。

contact

然后在模板中加入return render(request, 'customer/note_edit.html', {'form': form, 'contact': contact})

答案 1 :(得分:5)

这是因为您尝试以__init__形式执行此操作:

contact_id = kwargs.pop('pk')

但是在你的views.py方法中,你没有将它传递给表单构造函数。更改您的note_new方法,以便在表单中传递pk

form = NoteForm(request.POST, pk=pk)

避免异常的一种更安全的方法是使用pop的默认参数:

contact_id = kwargs.pop('pk', None)
super(NoteForm,self).__init__(*args,**kwargs)
if contact_id:
    # do something if pk is passed, otherwise contact_id is None