如何将字典发送回 Django 视图?

How to send dictionary back to Django view?

在我看来,我有一个用户字典,我将它传递给 args{} 字典中的模板(这可能不是正确的方法)。 然后,当我使用 AJAX 调用页面上的 POST 数据时,我希望该字典返回视图(以便向其添加新条目)。如何使用 JavaScript、jQuery 或 AJAX 将其发回?

如果有人想知道我到底在做什么:
我正在为模型做一个构造函数,因此客户可以搜索用户并将他们添加到某种组 table(一个一个地挑选),但在我可以保存模型之前,我需要跟踪用户客户补充道。我觉得为此使用字典不是一个好方法,但即使它是一个列表或其他东西,我仍然不知道如何在 AJAX 调用中保留数据。

下面给出的答案的补充
如果您有类似的问题,也许阅读它会很好
我最终将所有内容都写在一个脚本中并注意 - 不是在文件中,而是在标签中,由于某种原因,如果从文件中调用,解决方案和一些 jquery 函数无法按预期工作(很奇怪,我一直认为它绝对没有区别)。
所以是的,如果您按照下面的答案进行操作,您将能够将字典传回 Django 视图,但是您将传递的内容不再是字典,它不是 unicode 字符串。您需要将其转换回字典(如果您以后需要像字典一样使用它)。
您可以使用以下代码执行此操作:

import ast
received_dict = request.POST['received_dict']
newdict = ast.literal_eval(received_dict)

但要小心,尝试在您的页面上输出字典(最初发送的)以进行调试。出于某种原因,有时它可能包含 ' 而不是 " ' ",我相信如果你不将它传递给 .js 文件,它就会发生(也许是其他原因,不记得了)。因此,如果你有它,你可能需要在 ast.literal_eval 函数之前执行此操作:

received_dict= received_dict.replace("u'", "'") # Maybe you need to delete u also, try for yourself
received_dict = received_dict.replace("'", "'")

但我不使用它,如果 Javascript 在页面本身的内部,它似乎通过一切正常。

此外,如果有人想知道我在从 AJAX 生成的 html 获取值到脚本时遇到问题,jquery 看不到 ID 和东西。我通过更改此解决了我的问题(将其用作模板):

$('form').on('submit', function(e) {
        // some stuff
    });

对此:

$(document).on('submit', 'form', function(e) {
          // notice changes
            });

我认为这叫做事件委托。您将 'document' 作为选择器,然后 .on 和括号中首先是操作(可以是提交、单击或其他)以及它发生的位置(表单、div 等。可能您可以使用任何选择器)。抱歉,如果描述很愚蠢,我是 jquery.
的新手 我希望这会有所帮助...在一个页面上提出多个 ajax 请求真是令人头疼 :)

你可以这样做。

$.ajax({
                    url: "url-of the-view",
                    type: "POST",
                    data:{'data_dict':your_dict,}});

然后在你的视图中,你可以这样处理它:

if request.method=='POST':
    data_dict = request.POST.get('data_dict')

而且你可以在data_dict上做任何你想做的处理。

假设您已将 d 中的字典从视图传递到模板

{'d': data_dict}

现在首先像这样将字典 d 存储在 javascript 变量中。

$(document).ready(function(){
var my_data = "{{ d }}"
});

然后在 ajax 数据属性调用中传递这个变量。

                  $.ajax({
                    url: "your url",
                    type: "POST",
                    data:{'data_dict':my_data}
                    .......
                  });

让我知道这是否有效?让我知道。 可能你必须使用 json.stringyfy 和 json.loads.