Непоследовательное поведение сохранения (commit = False) для ModelForm в Django 2.2 - PullRequest
0 голосов
/ 10 июля 2020

У меня есть ModelForm, которая выбирает одно поле и исключает остальные, одно из которых является ForeignKey, которое мне нужно заполнить вручную перед сохранением формы.

Я в процессе исправления ошибки, которая одно из моих представлений имеет, и я использую объект request.session для хранения информации, так что функции методов GET и POST будут синхронизированы сеансом при поиске модели под рукой вместо отдельной итерации через базу данных для закрепления -указать, для какого объекта модели должны быть сохранены представленные данные.

Я использую функциональность form_object.save (commit = False) в других местах того же представления, и она работает так, как мне нужно, но для по какой-то причине есть раздел представления, где он просто не заполняет дополнительное поле перед вызовом возможного метода save (), и я получаю IntegrityError для этого столбца в базе данных, даже если в моей модели он не равен null = False объявление прямо сейчас (и я думаю, что это должно быть ...).

Итак, вот моя ModelForm: * 1 007 *

class PesoFormApertura(ModelForm):
    peso_apertura = forms.DecimalField(min_value=0,required=True)
    class Meta:
        model = Peso
        fields = ('peso_apertura',)

вот сама модель:

class Peso(models.Model):
    
    prodotto = models.ForeignKey(ProdottoPesato,on_delete=models.CASCADE)
    peso_apertura = models.DecimalField(max_digits=8,decimal_places=2, blank=False, null=True)
    peso_calcolato = models.DecimalField(max_digits=8,decimal_places=2, blank=True, null=True)
    peso_chiusura = models.DecimalField(max_digits=8,decimal_places=2, blank=True, null=True)
    data = models.DateField(auto_now_add=True, blank = False)

    def __str__(self):
        return "{} - {} - {}".format(self.prodotto.nome, self.prodotto.get_categoria_display(), self.data)

    def save(self, *args, **kwargs):
        if self.peso_apertura == 0:
            prodotto_associato = ProdottoPesato.objects.get(pk = self.prodotto.pk)
            if prodotto_associato.permanente == False:
                prodotto_associato.delete()
                self.delete()
            else:
                super().save(*args, **kwargs)
        else:
            super().save(*args, **kwargs)
    class Meta:
        ordering = ['prodotto']

и вот часть представления, где метод save () не работает (где я разместил комментарий):


        if not 'prodotto-da-correggere' in request.session:
            for prodotto in tutti_prodotti:
                pesi_questo_prodotto_oggi = prodotto.pesi_di_oggi()
                for peso in pesi_questo_prodotto_oggi:
                    if peso.peso_apertura == None:
                        prodotto_da_elaborare = prodotto
                        peso_del_giorno = peso
                        break
            if prodotto_da_elaborare:
                finito = False
                instance_peso = peso_del_giorno
                form = PesoFormApertura(request.POST, instance = instance_peso)
                if form.is_valid():
                    form.save(commit=False) # WORKS FINE
                    form.prodotto = prodotto_da_elaborare
                    form.save()
            else:
                form = PesoFormApertura(request.POST)

        else: # HERE IS WHERE IT DOESN'T BEHAVE LIKE ABOVE

            prodotto_da_elaborare = ProdottoPesato.objects.get(id=request.session['prodotto-da-correggere'])
            peso_del_giorno = None
            for peso in prodotto_da_elaborare.pesi_di_oggi():
                if peso.peso_apertura == None or peso.peso_apertura > 0:
                    peso_del_giorno = peso
                    break
            form_correzione = PesoFormApertura(request.POST, instance = peso_del_giorno)
            if form_correzione.is_valid():
                form_correzione.save(commit=False)
                form_correzione.prodotto = prodotto_da_elaborare
                form_correzione.save() # IT DOESN'T ADD THE INFORMATION TO  THE COLUMN WHEN IT SAVES
                request.session.flush()

Метод save () нормально работает для первой части оператора IF и просто не работает для остальной части фрагмента в разделе ELSE.

Так что мне интересно, есть ли что-то в сеансе делать с этим.

1 Ответ

0 голосов
/ 10 июля 2020

Когда вы вызываете form.save(), он возвращает экземпляр. Вы должны изменить и сохранить этот экземпляр.

if form_correzione.is_valid():
    peso = form_correzione.save(commit=False)
    peso = prodotto_da_elaborare
    peso.save()

Вы должны изменить другую часть представления, чтобы использовать этот подход. Похоже, что form.prodotto = prodotto_da_elaborare не действует, но вы не заметили, потому что prodotto уже установлен, поэтому вы не получите ошибки целостности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...