使用request.POST中的字典初始化表单

时间:2016-04-23 17:56:21

标签: django django-forms

我想要一个'save'表单选项,它将数据保存到数据库到Draft表。 (所以我不会将它与提交的数据混在一起)。

当用户点击提交时,我会创建一个草稿并用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)

它会保存POST,因为如果电子邮件是输入字段,那么POST中的多个复选框有{"email": ["my@mail.com"], "skills": ["01", "02", "03", "04"]}和post_to_json以这种方式保存的技能。 (如果我只是转储它,我会得到{email": "my@mail.com", "skills": "04"}所以一些技能会丢失(更不用说它不会在表格中正确初始化))。

现在我有一个问题,如何在用户返回并希望继续进行该过程时初始化表单。

我试着这样做:

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

但是在浏览器中我已经预先填写["my@mail.com"]而不是my@mail.com

当我尝试将MyFormClass(request.POST)转换为MyFormClass(request.POST)时,Django如何工作才能实际预填充该表单但是当我尝试将POST转换为字典然后以相同的方式使用它时它会失败?

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

任何想法怎么做?

1 个答案:

答案 0 :(得分: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)