Django发布来自浏览器的URL

时间:2013-09-07 20:48:55

标签: python django python-2.7

我正在浏览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

我应该在我的网址定义中使用正则表达式来捕获值吗?或者我是否正在接近这种情况?我正在使用这些教程,但修改它们以适应我正在做的一些工作。我真的不想要一个用户输入的表单,因为从长远来看,我将从远程位置(智能手机)发布这些数据,因此一个真正能够提交这些数据的网页对我来说不如我感兴趣。能够直接发布这些变化。

1 个答案:

答案 0 :(得分:1)

您应该从request.GET而不是request.POST读取您的查询参数,因为您正在发出GET请求(请参阅错误页面上的Request Method: GET)。

仅供参考,还有request.REQUEST字典:

  

为方便起见,首先搜索POST的字典对象,   然后GET。灵感来自PHP的$ _REQUEST。

但是,使用它并不是一个好习惯。最好是明确的。