首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于id丢失,formset函数更新视图不保存窗体。

由于id丢失,formset函数更新视图不保存窗体。
EN

Stack Overflow用户
提问于 2022-01-10 15:17:13
回答 1查看 110关注 0票数 0

我有一个视图来更新我的格式集的6,只有点击发送按钮给我错误,每个表单的id丢失.你是怎么修好的?

当我必须创建格式集时,id永远不会有问题.有人能告诉我哪里错了吗?我把代码留在下面

视图

代码语言:javascript
复制
@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)

模型

代码语言:javascript
复制
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'
    )

文件html

代码语言:javascript
复制
<form method="post" novalidate autocomplete="off" class="form-not-box">
    {% csrf_token %}
    <div class="box-schede">
        <div class="alert alert-pop-up mt-3" role="alert">
            Le colonne lasciate a 0 non verranno considerate.
        </div>

        {{ dati_formset.management_form }}

        <div class="row mt-3">
            {% for dati in dati_formset %}
                <div class="col-lg-2">
                    <div class="info-piano">
                        <div class="ico">
                            {% if forloop.counter == 1 %}
                                <object type="image/svg+xml" data="{% static 'img/icone/colazione.svg' %}">
                                    Icona colazione
                                </object>
                            {% elif forloop.counter == 3 %}
                                <object type="image/svg+xml" data="{% static 'img/icone/pranzo.svg' %}">
                                    Icona pranzo
                                </object>
                            {% elif forloop.counter == 5 %}
                                <object type="image/svg+xml" data="{% static 'img/icone/cena.svg' %}">
                                    Icona cena
                                </object>
                            {% elif forloop.counter == 2 or forloop.counter == 4 or forloop.counter == 6 %}
                                <object type="image/svg+xml" data="{% static 'img/icone/merenda.svg' %}">
                                    Icona cena
                                </object>
                            {% endif %}
                        </div>

                        <div class="form-floating mb-3 mt-3">
                            {{ dati.kcal|add_class:'form-control'|append_attr:"placeholder: dati" }}
                            {{ dati.kcal.label_tag }}
                        </div>
                        <div class="form-floating mb-3">
                            {{ dati.carboidrati|add_class:'form-control'|append_attr:"placeholder: dati" }}
                            {{ dati.carboidrati.label_tag }}
                        </div>
                        <div class="form-floating mb-3">
                            {{ dati.proteine|add_class:'form-control'|append_attr:"placeholder: dati" }}
                            {{ dati.proteine.label_tag }}
                        </div>
                        <div class="form-floating">
                            {{ dati.grassi|add_class:'form-control'|append_attr:"placeholder: dati" }}
                            {{ dati.grassi.label_tag }}
                        </div>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
    <div class="buttons mb-3">
        <a href="{% url 'gestione-piano' piano.id %}" class="btn btn-warning-rev">Indietro</a>
        <input type="submit" class="btn btn-warning" value="Aggiorna piano">
    </div>
</form>
EN

回答 1

Stack Overflow用户

发布于 2022-01-10 16:02:08

我的观察告诉我,您的问题是不应该包含id值的DatiFormSet字段,以及在queryset = dato中不需要的函数视图,但是在某些情况下,您应该添加一个Piano实例。

代码语言:javascript
复制
@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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70654693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档