gpt4 book ai didi

jquery - django Piston Post请求将字符串更改为列表

转载 作者:行者123 更新时间:2023-12-01 04:22:44 24 4
gpt4 key购买 nike

我有一个简单的 Django-Piston 处理程序,它创建模型的新实例并保存它。

从客户端,我使用 Javascript 对象和 JQuery.post 进行发布。

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

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

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

在活塞处理程序内部,在运行任何其他代码之前,在创建方法的顶部,我打印出 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 表单保存数据时,它将列表转换为字符串,当数据显示在客户端上时,它显示“[u'Formatting Test 7']”,而不是“Formatting Test 7”。

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

编辑:正如 JPIC 所说,我认为我遇到的错误不是错误,而是设计使然。我的问题是在将 QuerySet 与 Django 表单一起使用之前扩展其数据。

错误的方式:

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)

最佳答案

不是错误,你的数据一直在这样的列表中,这是Django的设计决策。无论使用 getlist() 方法以外的任何代码访问 QueryDict 实例并获取列表值,都错误地使用了 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&foo[]=test 不是标准的。

关于jquery - django Piston Post请求将字符串更改为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com