Данные Django ManagementForm отсутствуют или были подделаны

Я продолжаю получать ошибку:

[u'ManagementForm data is missing or has been tampered with']

Я тоже не могу понять, почему. Вот мое мнение:

   def CreateWorkout(request):
    WorkoutInlineFormSet = inlineformset_factory(workout,exercise)
    if request.method == "POST" : 
        formset = WorkoutInlineFormSet(request.POST)

        if formset.is_valid(): 
            formset.save(); 
    else: 
        formset = WorkoutInlineFormSet()
    return render_to_response('submit.html',{'formset': formset},context_instance=RequestContext(request))

И вот мой шаблон:

<body>
<form method="POST" action ="">
{{ formset.management_form }}
<table>
 {% for form in formset.forms %}
            {{ form }}
        {% endfor %}

        </table>
</form> 
</body>

Я читал, что вы должны включить formset.management_form, и у меня есть. Я думал, что это будет легко исправить, но я не смог понять проблему.

Ответы

Ответ 1

Когда вы используете встроенный набор форм, вам необходимо предоставить экземпляр, к которому относятся объекты.

# First, fetch the instance from the db
workout = code_that_fetches_instance()

if request.method == "POST" : 
    formset = WorkoutInlineFormSet(request.POST, instance=workout)
    ...
else: 
    formset = WorkoutInlineFormSet(instance=workout)

Для получения дополнительной информации см. пример в документах с помощью встроенного набора форм в представлении.

Если workout и exercise - ваши модели, вы должны следовать за соглашением python и переименовать их workout и exercise. Строчная строка workout должна быть экземпляром, с которым связаны все упражнения в вашем наборе форм.

Ответ 2

Я встречаю эту проблему.

Причина в том, что в ваших POST данных нет ничего типа form-TOTAL_FORMS, form-INITIAL_FORMS and form-MAX_NUM_FORMS).

Вы должны использовать {{ formset.as_p }}, это приведет к отображению данных management_form из набора форм. Если вы хотите сделать индивидуальный рендеринг форм, вы не должны забывать форму управления formet, чтобы данные POST были связаны с данными mangement_form.

Ответ 3

Изменить это:

  formset = WorkoutInlineFormSet(request.POST)

к этому:

 formset = WorkoutInlineFormSet(request.POST or None, request.FILES or None)