2011-05-29 64 views
0

我有這個型號:Django的更新型號的只有一個字段

class Balanta(models.Model): 
    data = models.DateField() 

class Conturi(models.Model): 
    cont=models.PositiveIntegerField() 
    cont_debit=models.DecimalField(default=0, max_digits=30, decimal_places=2) 
    cont_credit=models.DecimalField(default=0, max_digits=30, decimal_places=2) 
    balanta = models.ForeignKey(Balanta) 

,我有表單集模板中的工作確定這種觀點:

def balanta_introducere(request): 
    balanta=Balanta() 
    ConturiInlineFormSet=inlineformset_factory(Balanta, Conturi, extra=3) 
    if request.method=='POST': 
     balanta_form=BalantaForm(request.POST, instance=balanta) 
     if balanta_form.is_valid(): 
      balanta, created=Balanta.objects.get_or_create(**balanta_form.cleaned_data) 
      #return HttpResponseRedirect('/sitfin/balantaok') 
     formset=ConturiInlineFormSet(request.POST, request.FILES, instance=balanta) 
     if formset.is_valid(): 
      for form in formset: 
       data={ 
         'cont':form.cleaned_data.get('cont'), 
         'cont_debit':form.cleaned_data.get('cont_debit'), 
         'cont_credit':form.cleaned_data.get('cont_credit'), 
         'balanta':form.cleaned_data.get('balanta'), 
       } 
       try: 
        c=Conturi.objects.get(cont=data['cont']) 
       except Conturi.DoesNotExist: 
        cont_complete,created=Conturi.objects.get_or_create(**data) 
       else: 
        cont_complete,created=Conturi.objects.get_or_create(cont=data['cont'],cont_debit=data['cont_debit'],cont_credit=data['cont_credit'],balanta=data['balanta']) 
    else: 
     balanta_form=BalantaForm() 
     formset=ConturiInlineFormSet(instance=balanta) 
    return render_to_response('sitfin/balanta_introducere.html',{'balanta_form':balanta_form,'formset':formset}, context_instance=RequestContext(request)) 
  1. 如果我點擊第一次提交,所有數據進入數據庫(foreignkey和全部)
  2. 第二次提交相同的數據後,表單不做任何事情,這是可以的。
  3. 如果我在表單中更改一個值(例如,在「cont」的cont_credit中)並再次提交,我會得到另一個 Conturi對象只帶有已更新的「cont_credit」價值,這是不好的!

什麼是更新僅現有Conturi模型的某些領域與形式的幫助的方法嗎?

喜歡的東西:

If the cont it is not in the database, 
create a Conturi objects with the data in the form, 
If the "cont" is already in the database, 
Update the cont_credit and cont_debit data with the new values entered in the form 

非常感謝你。

回答

2

get_or_create正在嘗試使用您傳遞的所有參數進行獲取,因此如果窗體上發生任何更改,它將不會找到現有對象,而是會創建一個新對象。

如果您的表單是ModelForms,那麼您可以使用form.save()來保存綁定到表單的實例,並且formset.save()保存綁定到formset的所有實例。

編輯:
現在我注意到另一件事:你正在使用

balanta=Balanta() 

然後

balanta_form=BalantaForm(request.POST, instance=balanta) 

,這樣你就迫使形式使用新的實例。嘗試獲取您正在編輯的特定Balanta,並將其作爲實例傳遞。

+0

這不起作用。 formset.save()只是在數據庫上進行重複,每次我打到Sumbit,即使我編輯一個字段。但是,這看起來很有趣:「get_or_create試圖通過它傳遞所有參數get」 – Kaigara 2011-05-29 18:53:35

+0

只是注意到另一件事。編輯答案。 – 2011-05-29 19:09:19

+0

Balanta部分現在工作很好。 Conturi的部分是讓我瘋狂的東西。 – Kaigara 2011-05-30 16:53:59