所以我将一个站点从PHP(Codeigniter)转换为Django,认为这是一个很好的学习方法。我可以解决大多数问题但是我坚持这个问题。
在PHP中我可以$e->estimate = json_encode($_POST['estimate']);
将HTML输入数组存储为DB中的JSON编码字符串,python / django是否提供任何类似的功能。
我正在查看simplejson.dumps(request.POST['estimate'])
,但会抛出MultiValueDictKeyError
POST包含estimate[discount]
estimate[tax]
estimate[shipping]
Django / Python可以执行上述操作,使用HTML输入数组,JSON进行econde并将其存储在数据库中
答案 0 :(得分:0)
看了django中的文档后,我发现request.POST是一个QueryDict对象。
类QueryDict
在HttpRequest对象中,GET和POST属性 是django.http.QueryDict的实例。 QueryDict是一个类似字典的 自定义类来处理同一个键的多个值。这个 是必要的,因为一些HTML表单元素,特别是为同一个键传递多个值。
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict。
作为字典(JSON对象或Python dict),JSON序列化器不能有多个键抛出MultiValueDictKeyError,表示您有多个相同的键。
不确定php是如何做到的,但修复程序可能是以下任何一种
复制POST QueryDict并修改内容,以便没有任何重复的密钥。
更改正在提交的表单数据。
QueryDict的原因是,对于提交的表单,您可以有效地从表单中获取多个键,用于多选字段等。
希望有所帮助。标记
答案 1 :(得分:0)
您遇到的问题是MultiValueDictKeyError
,表示estimate
MultiValueDict
内没有request.POST
个密钥。尝试
# list existed keys
request.POST.keys()
# or
discount = request.POST.get('estimate[discount]')
tax = request.POST.get('estimate[tax]')
shipping = request.get('estimate[shipping]')
然后你可以构建类似
的东西estimate = dict(discount=discount, tax=tax, shipping=shipping)
simplejson.dumps(estimate)