我想要一个'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转换为字典然后以相同的方式使用它时它会失败?
所以我的目标是将数据从字典加载到表单中,以便在浏览器中预先填充。
任何想法怎么做?
答案 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)