Наборы циклических форм Django вызывают ошибку ValidationError в форме управления

Я пытаюсь вывести две одинаковые формы и сохранить их в базе данных с другим префиксом. Я использовал этот пост https://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ в качестве примера. Однако я получаю сообщение об ошибке проверки, что форма управления подделана. Не могли бы вы посоветовать, как это решить? Спасибо.

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

VIEWS.PY

from django.shortcuts import render
from .forms import modelformset_factory, AssumptionsForm
from .models import Assumptions

model_names = ['Form1', 'Form2']

def get_assumptions(request):

    AssumptionsFormset = modelformset_factory(
    Assumptions, form=AssumptionsForm, extra=5)

    if request.method == 'POST':

        formsets = [AssumptionsFormset(request.POST, prefix=thing) for thing in model_names]

        if all([formset.is_valid() for formset in formsets]):

            for formset in formsets:

                for form in formset:

                    form.save()

    else:

        formsets = [AssumptionsFormset(request.POST, prefix=thing) for thing in model_names]

    return render(request, 'assumptions.html', {'formsets': formsets})

ASSUMPTIONS.HTML

<div class="form">
  <form action="" method="post">
  {% csrf_token %}
  {% for formset in formsets %}
  {{ formset.management_form }}
  {{ formset.non_form_errors.as_ul }}
  <h1>{{formset.prefix}}</h1>
  <table id="formset" class="form">
  {% for form in formset.forms %}
    {% if forloop.first %}
    <thead><tr>
      {% for field in form.visible_fields %}
      <th>{{ field.label|capfirst }}</th>
      {% endfor %}
    </tr></thead>
    {% endif %}
    <tr class="{% cycle 'row1' 'row2' %}">
    {% for field in form.visible_fields %}
      <td>
      {# Include the hidden fields in the form #}
      {% if forloop.first %}
        {% for hidden in form.hidden_fields %}
        {{ hidden }}
        {% endfor %}
      {% endif %}
        {{ field.errors.as_ul }}
        {{ field }}
      </td>
    {% endfor %}
    </tr>
  {% endfor %}
  </table>
  <input type="submit" value="Submit">
  {% endfor %}
  </form>
  </div>

MODELS.PY

from django.db import models
from django.forms import ModelForm

class Assumptions(models.Model):

    Worst = models.FloatField(null=True, blank=True, default=None)
    Base = models.FloatField(null=True, blank=True, default=None)
    Best = models.FloatField(null=True, blank=True, default=None)

FORMS.PY

from django import forms
from django.forms import modelformset_factory, ModelForm
from .models import Assumptions

class AssumptionsForm(ModelForm):

    class Meta:
        model = Assumptions
        fields = '__all__'

person Martin    schedule 07.07.2018    source источник


Ответы (1)


Вы пытаетесь инициализировать наборы форм с request.POST по GET запросам, что, конечно, не работает.

Заменить второй

formsets = [AssumptionsFormset(request.POST, prefix=thing) for thing in model_names]

с участием

formsets = [AssumptionsFormset(prefix=thing) for thing in model_names]
person Community    schedule 09.07.2018