我正在浏览Django教程,我想弄清楚如何从浏览器发布对模型的更改。这是URL:
url(r'^(?P<person_id>\d+)/updatePerson/$', views.updatePerson, name='updatePerson')
)
以下是观点:
def updatePerson(request, person_id):
p = get_object_or_404(Person, pk=person_id)
# try:
# user = p.get(pk=request.POST['name'])
# except (KeyError, Person.DoesNotExist):
# Redisplay the poll voting form.
# return render(request, 'maps/detail.html', {
# 'person': p,
# 'error_message': "This person does not exist",
# })
#else:
p.lat = request.POST['lat']
p.lon = request.POST['lon']
p.task = request.POST['task']
p.save()
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse('maps:detail', args=(p.id,)))
我尝试的网址是:
<serveraddress>/maps/1/updatePerson/?lat=20&lon=20&task=hangOut
我收到此错误:
MultiValueDictKeyError at /maps/1/updatePerson/
"Key 'lat' not found in <QueryDict: {}>"
Request Method: GET
Request URL: <serveraddress>/maps/1/updatePerson/?lat=20
Django Version: 1.5.2
Exception Type: MultiValueDictKeyError
Exception Value:
"Key 'lat' not found in <QueryDict: {}>"
Exception Location: D:\Python\lib\site-packages\django\utils\datastructures.py in __getitem__, line 295
Python Executable: D:\Python\python.exe
Python Version: 2.7.5
Python Path:
['C:\\GXM_LABS\\gxm_maps',
'D:\\Python\\lib\\site-packages\\setuptools-1.1.3-py2.7.egg',
'D:\\Python\\lib\\site-packages\\django_evolution-0.6.9-py2.7.egg',
'D:\\Python\\lib\\site-packages\\south-0.8.2-py2.7.egg',
'C:\\Windows\\system32\\python27.zip',
'D:\\Python\\DLLs',
'D:\\Python\\lib',
'D:\\Python\\lib\\plat-win',
'D:\\Python\\lib\\lib-tk',
'D:\\Python',
'D:\\Python\\lib\\site-packages']
Server time: Sat, 7 Sep 2013 16:42:14 -0400
我应该在我的网址定义中使用正则表达式来捕获值吗?或者我是否正在接近这种情况?我正在使用这些教程,但修改它们以适应我正在做的一些工作。我真的不想要一个用户输入的表单,因为从长远来看,我将从远程位置(智能手机)发布这些数据,因此一个真正能够提交这些数据的网页对我来说不如我感兴趣。能够直接发布这些变化。
答案 0 :(得分:1)
您应该从request.GET
而不是request.POST
读取您的查询参数,因为您正在发出GET请求(请参阅错误页面上的Request Method: GET
)。
仅供参考,还有request.REQUEST字典:
为方便起见,首先搜索POST的字典对象, 然后GET。灵感来自PHP的$ _REQUEST。
但是,使用它并不是一个好习惯。最好是明确的。