原文引用 大专栏 https://www.dazhuanlan.com/2019/08/26/5d634d9cb14d2/
在《第一个Django应用》中,我根据教程总结了我对于Django应用开发过程的初步理解以及对应用开发步骤的梳理,在我尝试仅根据博文内容对应用进行复现的过程中出现了如下错误:
这个错误出现在我进入polls主页后选择其中一项标题进行投票时,投票结束后跳转到了http://127.0.0.1:8000/polls/1/vote/
,本来按道理应该是http://127.0.0.1:8000/polls/1/results/
,于是我将检查目标定在了/polls/views.py文档的vote()方法里,因为我在这个方法里设置了页面的跳转,如下:
1 |
def vote(request, question_id): |
分析解决
结合报错信息’not enough values to unpack(excepted 2, got 1)’,意思是在解包过程中少了一个数值,通过检察源码找到get()方法的信息:Perform the query and return a single object matching the given keyword arguments.通过给定的关键词语句执行查询并返回匹配的对象。request.POST是一个类似字典的对象,允许你通过键名访问提交的数据。本例中,request.POST[’choice’]返回被选择选项的ID,而ID是主键,因此改为pk=request.POST['choice']
即可。
总结
在创建一个新的models实例时,如果没有设置主键,那么Django会自动创建一个id字段作为该模型的主键,有时候用id和pk都能达到预期的效果,但是pk更加独立于真正的主键,也就是说不用在意主键是叫id或者是object_id。并且使用pk可以提高一致性,即便模型中有不同的主键。