如何将request.POST转储到dict,维护多个值字段?

2024-06-28 19:54:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将ModelForm数据存储在数据库中的JSONField中,以便以后能够从此数据创建对象,只需调用:

form = ModelForm(data_from_jsonfield_as_querydict)
if form.is_valid():
    object = form.save()

问题1:

我在邮件里有数据:

>>> print request.POST
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}

我必须把这个QueryDict转换成dict。但如果我调用request.POST.dict(),则会丢失字段-2中的列表值:

>>> print request.POST.dict()
{'field-1': 'value1', 'field-2': 'value-2b'}

我试图使用request.POST.getlist,但随后我以列表的形式获取所有值:

>>> for k in request.POST.keys():
...     print request.POST.getlist(k)
[u'value1']
[u'value-2a', u'value-2b']

我甚至无法检查上述循环中的给定值是否为列表实例,因为如果值为列表,则request.POST.get(k)不会返回错误,另一方面,request.POST[k]为每个字段返回MultiValueDictKeyError

我想到的唯一解决方案是循环遍历通过getlist()获得的所有字段,并将一个值列表转换为字符串,但在我看来,这似乎有点过头了。

问题2:

假设问题1已经解决,并且我有dict表单数据存储在数据库中,如下所示:

# object.data
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}

当我想用上面的dict作为表单数据创建对象时,我必须将其转换为QueryDict,这可以简单地通过:

querydict = QueryDict('', mutable=True)
querydict.update(object.data)

然后:

form = ModelForm(querydict)

问题是,当使用列表实例的某些值从dict创建querydict时,所有querydict值都包装在列表中:

print querydict
{u'field-1': [u'value1'], u'field-2': [[u'value-2a', u'value-2b']]}

因此,field-2的表单验证失败,因为该字段的getlist返回列表列表(只有一个值)而不是值列表。


Tags: 数据formfield列表dataobjectvaluerequest