我有一个简单的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)
答案 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不是标准的。