2016-04-23 62 views
0

我想要一个'保存'表单选项,它将数据保存到数据库到草稿表中。 (所以我不把它与提交的数据混合)。使用请求字典初始化表单。POST

当用户点击提交时,我创建一个草稿并用POST数据填充它。

Draft.objects.get_or_create(email=email) 
draft.data = post_to_json(self.request.POST) 
draft.save() 

Post_to_json做以下

def post_to_json(post): 
    dictionary = {} 
    for key in post.keys(): 
     data = post.getlist(key) 
     dictionary[key] = data 
    return json.dumps(dictionary) 

它保存的职位,因为它是如此,如果邮件是一个输入字段和技巧在哪里张贴multicheckbox有{"email": ["[email protected]"], "skills": ["01", "02", "03", "04"]}和post_to_json保存这种方式。 (如果我只是倾倒它,我会得到{email": "[email protected]", "skills": "04"},所以一些技能会丢失(更不用说它不会在表单中正确初始化))。

现在,我有一个问题,当用户返回并希望在该过程中继续时,如何初始化窗体。

我试图做的:

def get_initial(self): 
    draft_uuid = self.kwargs.get('uuid') 
    draft = Draft.objects.get(uuid=draft_uuid) 
    return json.loads(draft.data) 

但随后在浏览器中我已预填["[email protected]"],而不是仅仅[email protected]

Django是如何工作的,它可以在我做MyFormClass(request.POST)的时候实际预填表单,但是当我尝试将POST转换为字典并以同样的方式使用它时失败了吗?

因此,我的目标是将数据从字典加载到表单中,以便在浏览器中预填充数据。

任何想法如何做到这一点?

回答

0

将数据转换回{field:value}格式,并将其设置为窗体初始位置,无论您在何处实例化窗体。

https://docs.djangoproject.com/en/1.9/ref/forms/fields/#initial

为什么你不能做到这一点 -

data = user.get_initial() # Giving you the json format 
mcb_fields = ("skills",) #If you have more such fields, write their name here 
init_data = {} 
for key, value in data.iteritems(): 
    if key in mcb_fields: 
     init_data.update({key :value}) # check if you have to convert each value to int or if it accepts string (this is in str format) 
    else: 
     init_data.update({key :value[0]}) 
form = SomeDraftForm(initial =init_data) 
+0

我已经试过了,但它不工作,因为我的数据是这样的:'{“邮件”:'我@ mail.com']}'所以当我这样做的时候我有'['[email protected]']'在形式.....我也试图像'if len(value)=' = 1:返回值[0]'但我不工作,那么只有1个答案被勾选时,对于多核框。 – Zoli