django обновляет только одно поле модели через форму - PullRequest
0 голосов
/ 29 мая 2011

У меня есть эти модели:

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_credit", например, "cont") и снова нажмите "Отправить", я получаю другой объект Conturi только с измененным "cont" с обновленным значением "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

Большое спасибо.

1 Ответ

2 голосов
/ 29 мая 2011

get_or_create пытается получить все параметры, которые вы передаете, поэтому, если что-то изменится в форме, он не найдет существующий объект, а вместо этого создаст новый.

Если ваши формы ModelForms , то вы можете просто использовать form.save () для сохранения экземпляра, привязанного к форме, и formset.save () чтобы сохранить все экземпляры, связанные с набором форм.

EDIT:
Теперь я заметил еще одну вещь: вы используете

balanta=Balanta()

, а затем

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

поэтому вы заставляете форму использовать новый экземпляр. попробуйте получить конкретный Balanta, который вы редактируете, и передайте его как экземпляр.

...