-1

所以我有这个表格(为了清楚起见,删除了一些元素)

<form id="{{ section }}-submission-form{{ cell_id }}">

    <input type=hidden name="section" value="{{ section }}" />
    <input type="hidden" name="school" id="{{ section }}-submit-school{{ cell_id }}" />


    {% if section == "posts" %}
        <input type=hidden name="url" />
        <textarea class="{{ section }}txtinput{{ cell_id }}" name="text-submission"
                  default="{% if is_advice %}What's your question?{% else %}What's on your mind?{% endif %}"
                  id="{{ section }}-suggestion-box{{ cell_id }}"
                  style="margin: 0 0 .5em 0;font-family: Arial, sans-serif;font-size: 14px; width: 410px;"
                  rows='8'></textarea>
        <br />
    {% endif %}
    {% if section == "photos" %}
        <span style='line-height: 40px;'>
        <label class="photouploadlabel">URL</label><input type="text" name="image-url" style="width: 335px" /><br>
        <label class="photouploadlabel">File</label><input type="file" name="image-file" style="width: 335px"/><br>
        <label class="photouploadlabel">Caption</label><input type="text" id="image-caption{{ cell_id }}"
                                                              name="image-caption" style="width: 335px" default="optional"/>
        </span>
    {% endif %}


    <div id="{{ section }}-bottomdiv{{ cell_id }}" style="height: 45px; margin-top: .5em; width: 413px;">
        <div style="height: 45px">
        <label id="{{ section }}-tagsbutton{{ cell_id }}"
               style="margin-right: .5em; cursor: pointer; vertical-align: bottom; float:left; line-height: 1.8em;">Tags</label>

        <input id="{{ section }}-tagsinput{{ cell_id }}" type="text" name="tags-list" style="position: relative"/>
                    <button id="send-{{ section }}-suggestion{{ cell_id }}" disabled="disabled"
                style="float:right; position: relative; bottom: 7px; right: -4px;">Post</button>
        </div>

标签列表输入变成自动完成,用户选择标签,然后将其添加到全局 js 变量“选定标签”中。当用户按“发布”时,我有以下代码:

           alert(selectedtags);
       $("#"+section+"-submission-form"+cellid).ajaxSubmit({
           url: '/save-suggestion/',
           type: 'post',
           data: {'tags': selectedtags },
           dataType: 'json',
           success: function(response){
               clear_text(section, cellid);
               location.reload();
           },

这是奇怪的一点:无论我在哪个部分,警报都有效。但是,如果我在服务器端打印 request.REQUEST ,如果该部分是我得到的照片

{u'image-url': u'http://i.imgur.com/vUxla.jpg', u'tags-list': u'', u'tags': u'wtf,crazy,pics', u'section': u'photos', u'school': u'1997', u'anonymity-level': u'schoolandmajor', u'image-file': u'', u'image-caption': u''}

即我想要的。但如果该部分是帖子,我得到

{u'text-submission': u'wtf', u'school': u'1997', u'tags-list': u'', u'url': u'', u'section': u'posts', u'tags[]': u'crazy', u'anonymity-level': u'schoolandmajor'}

因此,它不仅重命名为 tags[] (我以前见过并且不太关心,但是......),它还将我的标签列表截断为最后一个条目。

有谁知道我做错了什么?

编辑:经过进一步检查,这是使用 request.REQUEST 所做的事情,而不是 request.POST。

所以,仍然,发生了什么?

4

2 回答 2

4

request.REQUEST是一个MergedDict,它包含一个QueryDict用于 POST 和一个用于 GET。迭代 MergedDict 时,您将获得每个键的单个值,这就是该__str__方法对该类所做的。QueryDict.getlist您可以像这样使用来解决这个问题:

print request.REQUEST.getlist('tags[]')

在我的测试中,产生:

[u'asd', u'123']

如果我只是print request.REQUEST['tags[]'],我只得到123

于 2012-08-09T01:24:12.780 回答
0

您的问题似乎出在您的 JavaScript 中。您收到的两个请求的数据似乎不同。在第一个请求tags中是以下字符串:

u'tags': u'wtf,crazy,pics'

但是,在后者中,标签设置如下:

u'tags[]': u'crazy'

正如您所提到的,名称已更改,仅保留最后一项。这种差异似乎源于这样一个事实,即第一个请求tags不是一个列表,而是一个逗号分隔的字符串。

我认为您将通过更改代码以使对该变量的处理保持一致来解决您的问题。基于发送列表会给您带来问题的事实,您可能会建议要走的路是您的第一个请求的逗号分隔字符串。

使用列表时您没有获得正确数据的事实可能是由于 JSON 数据接收端的解析器,因为它在技术上是一个对象,并且一个对象不能有两个同名的成员(以及您的代码可能将它们全部发送为tags[])。

于 2012-08-09T01:25:22.417 回答