У меня есть 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.
Так что мне интересно, есть ли что-то в сеансе делать с этим.