【问题标题】:django Piston Post Request Change strings to listsdjango Piston Post Request 将字符串更改为列表
【发布时间】:2012-02-24 07:39:45
【问题描述】:

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

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

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

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

如你所见,只设置了title、description和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 Form 保存数据时,它会将列表转换为字符串,当数据显示在客户端上时,它会显示“[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)

【问题讨论】:

    标签: jquery python django post django-piston


    【解决方案1】:

    不是错误,您的数据一直在这样的列表中,这是 Django 的设计决定。任何代码正在访问 QueryDict 实例并获取列表值,而不是使用 getlist() 方法使用 QueryDict 错误。

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

    ?foo=bar&amp;foo=test&amp;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 不是标准的。

    【讨论】:

    • 谢谢,这很有帮助。它帮助我理解问题在于我在将数据放入表单集之前如何更新数据。请参阅我的问题中的编辑以获取解决方案。
    猜你喜欢
    • 2015-10-24
    • 2015-10-28
    • 2010-12-18
    • 2012-05-24
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多