Функция обновления представления набора форм не сохраняет формы из-за отсутствия id

У меня есть представление для обновления 6 моих наборов форм, только при нажатии на кнопку отправки возникает ошибка, что id каждой формы отсутствует... как это исправить?

Когда мне приходится создавать formset, никогда не возникает проблем с id... Может ли кто-нибудь сказать мне, где я ошибаюсь? Я оставляю свой код ниже

view

@login_required
def PianoSingleUpdateView(request, id):
    piano = models.Piano.objects.get(single_piano__id = id)
    piano_sett = models.PianoSingleDay.objects.get(id = id)
    dato = models.PianoDay.objects.filter( piano_day = piano_sett)

    DatiFormSet = modelformset_factory(models.PianoDay, extra = 0, fields=('id', 'kcal', 'carboidrati', 'proteine', 'grassi'))
    
    if request.method == 'POST':
        dati_formset = DatiFormSet(request.POST, request.FILES, queryset = dato)

        if dati_formset.is_valid():
            for dato in dati_formset:
                dato.save()

            return redirect('gestione-piano', id = piano.id)
    else:
        dati_formset = DatiFormSet(queryset = dato)

    context = {'piano': piano, 'piano_sett': piano_sett, 'dati_formset': dati_formset}
    return render(request, 'crud/update/update_piano_giornaliero.html', context)

модели

class Piano(models.Model):
  nome_piano = models.CharField(max_length=100)
  data_inizio = models.DateField()
  data_fine = models.DateField()
  utente_piano = models.ForeignKey(
    User, 
    on_delete = models.CASCADE,
    related_name = 'utente_piano'
  )
  
  def __str__(self):
    return self.nome_piano
  

class PianoSingleDay(models.Model):
    giorni_settimana_scelta = [
        ("1","Lunedì"),
        ("2","Martedì"),
        ("3","Mercoledì"),
        ("4","Giovedì"),
        ("5","Venerdì"),
        ("6","Sabato"),
        ("7","Domenica")
    ]
    giorni_settimana = models.CharField(
        choices = giorni_settimana_scelta,
        max_length = 300
    )
    single_piano = models.ForeignKey(
        Piano,
        on_delete = models.CASCADE, 
        related_name = 'single_piano'
    )

    def __str__(self):
        return self.giorni_settimana


class PianoDay(models.Model):
    scelta_pasto = [
        ("1","Colazione"),
        ("2","Spuntino mattina"),
        ("3","Pranzo"),
        ("4","Merenda"),
        ("5","Cena"),
        ("6","Spuntino sera")
    ]
    pasto = models.CharField(
        choices = scelta_pasto,
        max_length = 300,
        default = '-'
    )
    kcal = models.IntegerField(default = 0)
    grassi = models.IntegerField(default = 0)
    carboidrati = models.IntegerField(default = 0)
    proteine = models.IntegerField(default = 0)
    piano_day = models.ForeignKey(
        PianoSingleDay,
        on_delete = models.CASCADE, 
        related_name = 'piano_day'
    )

file html

Мое наблюдение подсказывает мне, что ваша проблема заключается в полях DatiFormSet, которые не должны содержать значение id, а также ваша функция view имела в queryset = dato, что не нужно, но в некоторых случаях вы должны добавить экземпляр Piano.

@login_required
def PianoSingleUpdateView(request, id):
    piano = models.Piano.objects.get(single_piano__id = id)
    piano_sett = models.PianoSingleDay.objects.get(id = id)
    dato = models.PianoDay.objects.filter( piano_day = piano_sett)

    DatiFormSet = modelformset_factory(models.PianoDay, extra = 0, fields=('kcal', 'carboidrati', 'proteine', 'grassi'))
    
    if request.method == 'POST':
        dati_formset = DatiFormSet(request.POST, request.FILES , instance=piano)

        if dati_formset.is_valid():
            for dato in dati_formset:
                dato.save()
                return redirect('gestione-piano', id = piano.id)
    else:
        dati_formset = DatiFormSet(request.POST)

    context = {'piano': piano, 'piano_sett': piano_sett, 'dati_formset': dati_formset}
    return render(request, 'crud/update/update_piano_giornaliero.html', context)
Вернуться на верх