不用说我是一个菜鸟!所以这是我的js代码,它通过ajax将js对象发送到视图
function test(){
arr = {} ;
$('#settings_tab').find('.someclass').each(function(index, element) {
key = $(this).attr('id') ;
value = $(this).val();
arr[key] = value;
});
$.post("{% url 'setting-update' %}",
{arr:arr, csrfmiddlewaretoken: '{{ csrf_token }}'},
function(){
alert('done!');
}
);
}
在firebug中发布的数据看起来像这样
arr[adminName]
arr[contactAddress]
arr[contactEmail]
arr[contactPhone]
arr[perPage]
arr[siteDisableMsg]
arr[siteTitle]
arr[uploadSize]
csrfmiddlewaretoken BFrb8snw8zime8UI8Vukl8FirsHvDDUk
heer是我的django view.py
def update(request):
if request.POST :
print('-------------------------------------------------')
print(request.POST)
arr = request.POST.getlist('arr', None)
print(arr)
if(arr is not None):
for k,v in arr:
print(k)
return HttpResponse('done !')
但在这一行
arr = request.POST.getlist('arr', None)
print(arr)
继续获取[]
...如何从POST获得arr
?
<QueryDict: { 'csrfmiddlewaretoken': ['BFrb8snw8zime8UI8Vukl8FirsHvDDUk'], 'arr[adminName]': [''],
'arr[uploadSize]': [''], 'arr[adminName]': [''], 'arr[contactEmail]': [''], 'arr[siteTitle]': [''], 'arr[perPage]': ['']}>
答案 0 :(得分:2)
有两点要注意,首先,JQuery正在压缩你的数据结构。对于词典中的每个元素(即arr
变量),它会在QueryDict
中使用唯一键创建一个元素。
所以,
var arr = {'one': 'data1', 'two': 'data2'};
变为
<QueryDict: {'arr[one]': 'data1', 'arr[two]': 'data2'}>
这与你所看到的非常一致。但是,在您的情况下,实际上看起来您并没有使用值填充数组。你的萤火虫和QueryDict
输出都暗示你有一个空字典。我会调查javascript的以下行中的值是什么
value = $(this).val();
此外,您使用的是getlist()
错误,它会为您提供与QueryDict中的某个键相关联的列表,它不会像您期望的那样为您提供字典。
您要探索的内容如下:首先使用JSON.stringify()
序列化您的数组,如下所示:
$.post("{% url 'setting-update' %}" , { 'arr': JSON.stringify(arr), csrfmiddlewaretoken : '{{ csrf_token }}' });
然后通过
将其转换为视图中的python dictimport json
yourdict = json.loads(request.POST.get('arr'))
答案 1 :(得分:1)
首先需要将对象序列化为json字符串:
sumProbs :: (Eq a) => Prob a -> Prob a
sumProbs = Prob . foldr go [] . getProb
where
go (x, y) = run
where
run [] = (x, y):[]
run ((a, b):rest)
| x == a = (x, y + b): rest
| otherwise = (a, b): run rest
然后在views.py
中$.post("{% url 'setting-update' %}" ,
{
arr: JSON.stringify(arr), // <-----------
csrfmiddlewaretoken : '{{ csrf_token }}'
},
function(){alert('done!')}
});