2016-04-23 78 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