我可能正在做一些愚蠢的事情,但无法弄清楚是什么,它让我疯了,因为它是微不足道的,我有其他应用程序使用相同的逻辑。
所以我有一个模型客户和模型说明。每个客户我都可以创建很多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 %}
有什么建议吗?
谢谢。
答案 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