2012-02-20 191 views
0

我之前發佈過關於這個問題的文章,但是我仍然沒有找到解決方案,所以我希望這次能有更好的運氣。Django覆蓋表單數據保存

我有一個表單,用戶輸入的數據。在另一個頁面中,我創建了用戶已填充的相同表單(預填充了該信息)以進行編輯。用戶會來到這個頁面來編輯他們已經放入的信息。我的問題是它不覆蓋實例。

def edit(request): 

    a = request.session.get('a', None) 

    if a is None: 
     raise Http404('a was not found') 

    if request.method == 'POST': 
     form = Name_Form(request.POST, instance=a) 
     if form.is_valid(): 
      j = form.save(commit=False) 
      j.save() 
    else: 
     form = Name_Form(instance = a) 

對於這種形式,我使用了一些值「unique_together」。我也在調用模板中的{{form.non_field_errors}}。

當我在編輯視圖中進行更改時,如果字段更改涉及「unique_together」中定義的那些字段,則返回錯誤告訴我該實例已存在。否則它會保存一個新的實例。這不是重寫。

請注意,我使用unique_together的原因是,我想阻止用戶最初輸入兩次相同的表單(在編輯階段之前,在初始輸入視圖中)。

任何想法?

編輯:請注意「a」是指包含所有可用實例的下拉框的會話。結轉後將指示用戶想要編輯哪個實例。 `

+1

在以前的觀點,你有沒有保存「a」到數據庫中,你將它添加到會話之前?如果你打印一個.id(我懷疑它可能是'None'),會發生什麼? – Alasdair 2012-02-20 20:10:15

+0

是的,它們被保存到數據庫..當我打印它時,實際上給了我ID ..不僅如此,而且它成功預先填寫a的所有字段的形式,所以它肯定會將其結束。 – JohnnyCash 2012-02-20 20:35:04

+0

「a」引用另一個視圖中的下拉框,用戶將選擇該下拉框來指示他們想要編輯的實例 – JohnnyCash 2012-02-20 20:36:45

回答

1

爲什麼不這樣做你想要保存和拉離領域模型的數據庫查詢形成模型然後保存模型?

1

而不是在會話中存儲模型a你應該將它存儲在數據庫中。然後編輯:

def edit(request, pk): 

    a = A.objects.get(pk = pk) 
    ... 

PKa標識,你可以把它通過urls.py.查看我鼓勵你使用POST/Redirect/GET模式。

您可以在自己的模型來控制流程(草案有效)添加一個「狀態」欄

+0

模型被保存在數據庫中..「a」是指在另一個視圖中的下拉框,用戶將選擇它將指示他們想編輯的WHICH實例。 – JohnnyCash 2012-02-20 20:37:30

+0

我建議你改變方法來將實例轉換到視圖。使用網址而不是會話。 – danihp 2012-02-20 20:41:26

0

您不應該在會話中保存對象。如果你真的需要使用一個會話 - 保存一個PK並在提交給Form之前檢索對象。但更好的解決方案是使用GET或POST參數發送它或包含在url中。會話是不可靠的,它內部的數據可以在用戶請求之間被破壞。

而且你可以在一個更Python的方式檢索會話值:

try: 
    a = request.session['a'] 
except KeyError: 
    raise Http404('a was not found')