如何解决如果包含模型,如何序列化cleaned_data?
| 我正在尝试序列化一些表单数据,以便可以将其填充到一个隐藏字段中,直到用户准备提交整个表单为止(想一个向导)。 我正在尝试:print simplejson.dumps(vehicle_form.cleaned_data)
但是我不断收到这样的错误:
<VehicleMake: Honda> is not JSON serializable
真的,我只需要它输出\“ Honda \”的PK。
这也不起作用:
print serializers.serialize(\'json\',vehicle_form.cleaned_data)
给出:
\'str\' object has no attribute \'_meta\'
大概是因为它正在遍历所有都是字符串的键,而我认为它需要一个我没有的查询集。
那么我该怎么做呢?
好的,到目前为止,我已经提出了:
from django.utils.simplejson import JSONEncoder,dumps,loads
from django.utils.functional import curry
from django.db.models import Model
from django.db.models.query import QuerySet
from django.core.serializers import serialize
class DjangoJSONEncoder(JSONEncoder):
def default(self,obj):
if isinstance(obj,Model):
return obj.pk
elif isinstance(obj,QuerySet):
return loads(serialize(\'json\',obj,ensure_ascii=False))
return JSONEncoder.default(self,obj)
json_encode = curry(dumps,cls=DjangoJSONEncoder)
json_decode = loads
根据我在[这里] [1]找到的答案。现在,我正在尝试:
json = json_encode(vehicle_form.cleaned_data)
data = json_decode(json)
vehicle = Vehicle(**data)
前两行工作正常,但第三行导致异常:
Cannot assign \"3\": \"Vehicle.model\" must be a \"VehicleModel\" instance.
越来越接近!虽然不确定如何处理这个问题...
解决方法
这有点hack,但是我不知道有更好的方法:
try:
vehicle_data = simplejson.loads(request.POST[\'vehicle_data\'])
except ValueError:
vehicle_data = []
vehicle_data.append(vehicle_form.raw_data())
request.POST[\'vehicle_data\'] = simplejson.dumps(vehicle_data)
它从表单中的隐藏字段中获取JSON数据,并将其解码为Python dict。如果不存在,它将启动一个新列表。然后,它会附加新的原始/未清除的数据并对其进行重新编码,并将其转储到隐藏字段中。
为此,您需要复制POST数据(request.POST.copy()
)使其变得可变,或像我一样修改它:data9ѭ
我在表单模板中输入:
<input type=\"hidden\" name=\"vehicle_data\" value=\"{{request.POST.vehicle_data}}\" />
最后,为了访问表单的原始数据,我添加了以下方法:
from django.forms import *
def _raw_data(self):
return dict((k,self.data[self.add_prefix(k)]) for k in self.fields.iterkeys())
def _raw_value(self,key,value=None):
if value is None:
return self.data[self.add_prefix(key)]
self.data[self.add_prefix(key)] = value
Form.raw_data = _raw_data
Form.raw_value = _raw_value
ModelForm.raw_data = _raw_data
ModelForm.raw_value = _raw_value
由于.data
返回的数据过多(实际上,它只是返回您最初传入的POST数据),加上前缀,这是我所不希望的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。