django只通过表单更新模型的一个字段

时间:2011-05-29 17:30:21

标签: django forms views

我有这个型号:

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和all)
  2. 在第二次提交后使用相同的数据,表单没有做任何事情,这没关系。
  3. 如果我更改了表单中的值(例如,在“cont”的“cont_credit”中)并再次点击提交,我得到另一个 Conturi对象,只有修改后的“cont”与更新后的“cont_credit”值并不好!
  4. 在表单的帮助下,仅更新现有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
    

    非常感谢。

1 个答案:

答案 0 :(得分:2)

get_or_create正在尝试使用您传递的所有参数,因此如果表单上有任何更改,它将找不到现有对象,而是创建一个新对象。

如果您的表单是ModelForms,那么您可以使用form.save()来保存绑定到表单的实例,并使用formset.save()来保存绑定到表单集的所有实例。

修改
我现在注意到另一件事:你正在使用

balanta=Balanta()

然后

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

因此您强制表单使用新实例。尝试获取您正在编辑的特定Balanta,并将其作为实例传递。