Данные 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)