django Piston Post Request将字符串更改为列表

时间:2012-02-01 15:58:08

标签: jquery python django post django-piston

我有一个简单的Django-Piston Handler,可以创建一个新的模型实例并保存它。

从客户端,我使用Javascript Objects和JQuery.post发布。

使用Firebug检查数据时,帖子字符串如下所示:

classification=&organization=&title=Formatting+Test+7&description=test&created_by=created_on=&last_modified=&csrfmiddlewaretoken=a8352bb51f88c271119a81228a5c291f

如您所见,只设置了标题,描述和csrfmiddlewaretoken。

在Piston Handler内部,在运行任何其他代码之前,在create方法的顶部,我打印出request.POST:

print 'POST:', request.POST

在Django Dev Server输出中打印以下内容:

POST: <QueryDict: {u'description': [u'test'], u'classification': [u''], u'title': [u'Formatting Test 7'], u'created_by': [u''], u'created_on': [u''], u'last_modified': [u''], u'organization': [u''], u'csrfmiddlewaretoken': [u'a8352bb51f88c271119a81228a5c291f']}>

如您所见,现在所有数据都在列表中。当我使用Django表格保存数据时,它将列表转换为字符串,当数据显示在客户端上时,而不是“格式化测试7”,它显示“[u'Formatting Test 7']”。

谷歌搜索似乎没有让任何有同样问题的人回归,而且我已经使用活塞超过6个月了,我之前从未见过这样的错误。

编辑:正如JPIC所说,我认为我遇到的错误不是错误,而是设计错误。我的问题是在使用Django Form之前扩展QuerySet中的数据。

错误的方式:

some_initial_data = {
    'created_by': creator.pk, 
    'organization': org.pk,
    'classification': 7
} 
post = dict(request.POST)
post.update(some_initial_data)
form = MyModelForm(post)

正确的方式:

如QueryDict的更新方法中所述:https://docs.djangoproject.com/en/1.3/ref/request-response/#querydict-objects

some_initial_data = {
    'created_by': creator.pk,
    'organization': org.pk,
    'classification': 7
}
post = request.POST.copy()
post.update(initial_data)
form = MyModelForm(post)

1 个答案:

答案 0 :(得分:2)

错误,您的数据一直在这样的列表中,它是来自Django的设计决策。无论代码访问QueryDict实例并获取列表值(而不是getlist()方法)都使用QueryDict错误。

QueryDict允许键的多个值,即:foo=bar&foo=test您的QueryDict将类似于{u'foo': [u'bar', u'test']}

?foo=bar&foo=test&x=y的示例:

ipdb> request.GET
<QueryDict: {u'x': [u'y'], u'foo': [u'bar', u'test']}>
ipdb> request.GET['x']
u'y'
ipdb> request.GET.getlist('x')
[u'y']
ipdb> request.GET['foo']
u'test'
ipdb> request.GET.getlist('foo')
[u'bar', u'test']

正如您所看到的,QueryDict是一个列表的字典,默认情况下不会求助于实际列表:它将像普通字典一样运行。因此,如果某些代码正在获取列表,那么它使用的是QueryDict错误。

值得一提的是,如果您想使用$.post(url, {'foo':['bar', 'test']}),则需要调用 $。ajaxSettings.traditional = true

这对于复选框或多选项很有用。如果我错了,请纠正我,但这是标准的,PHP方式foo [] = bar&amp; foo [] = test不是标准的。