【问题标题】:Django form ValidationErrorDjango 表单验证错误
【发布时间】:2016-03-20 10:50:49
【问题描述】:

我在一个视图中有两个表单。一种htlm 形式包括form 和formset,另一种html 形式只包括单一形式。

当我尝试提交单一表单(提醒)时,我收到此错误:

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

查看:

    form_class = CreateEventForm
    second_form_class = modelformset_factory(EventTime, form = EventTimeForm, extra=3, formset=EventTimeFormset)
    third_form_class = Reminder
    model = Event
    template_name = 'eventAdmin.html'
    def get_context_data(self, **kwargs):
            context = super(EventAdminPage, self).get_context_data(**kwargs)
            context['form'] = self.form_class(self.request.POST or None, prefix="form", instance = self.object)
            context['formset'] = self.second_form_class(
                self.request.POST or None,
                prefix="formset", 
                queryset=context['event_times'])
            context['reminder_form'] = Reminder(self.request.POST or None)
            return context

        def post(self, request, **kwargs):
            self.object = self.get_object()
            event_times = EventTime.objects.filter(event = self.object).exclude(start_time = None)
            if 'update_event_form' in request.POST:
                form_class = self.get_form_class()
                form = self.form_class(request.POST, prefix="form", instance=self.get_object())
                formset = self.second_form_class(request.POST, prefix="formset", queryset=event_times)
                if form.is_valid() and formset.is_valid():
                    event = form.save()
                    event_times = formset.save()
                    return HttpResponseRedirect('/event-admin-%s' %self.kwargs['event_id']) 
                else:
                    return self.render_to_response(
                        self.get_context_data(form=form, formset=formset))
            if 'reminder_form' in request.POST:
                form_class = self.second_form_class
                form_name = 'Reminder'
                form = form_class(request.POST)
                if form.is_valid():
                    form.save(commit=False)
                    message = form.cleaned_data.get('text')
                    return HttpResponseRedirect('/event-admin-%s' %self.kwargs['event_id']) 
                else:
                    return self.render_to_response(
                        self.get_context_data(form=form))

引发错误的表单HTML:

<form method='POST' action=''><input type='hidden' name='csrfmiddlewaretoken' value='3uQyEn4m8bHpM7Jy6a8WKQz5A8Uf6RZF' />


<div id="div_id_text" class="form-group"> <label for="id_text" class="control-label  requiredField">
                Text<span class="asteriskField">*</span> </label> <div class="controls "> <textarea class="textarea form-control" cols="40" id="id_text" maxlength="500" name="text" rows="10">
</textarea> </div> </div>

            <input class="btn btn-primary" type="submit" name="reminder_form" value="Send" />
        </form> 

【问题讨论】:

  • 首先,确保在模板中包含管理表单。其次,您似乎忘记在 if 'reminder_form' in request.POST: 块中使用前缀 form = form_class(request.POST)
  • 我在两个地方都添加了前缀(创建实例时的上下文方法和 post 方法),还添加了 {{reminder.management_form }}。仍然面临同样的错误
  • 张贴您的 html 可能会提供更多亮点。
  • 添加了引发错误的表单 html

标签: python django forms formset


【解决方案1】:

您需要在&lt;form method='POST' action=''&gt; 之后添加此行{{ form.management_form }}。 Django 使用它来管理表单集中的表单。

<form method='POST' action=''>
  {{ form.management_form }}
  <input type='hidden' name='csrfmiddlewaretoken' value='3uQyEn4m8bHpM7Jy6a8WKQz5A8Uf6RZF' />
  <div id="div_id_text" class="form-group"> 
    <label for="id_text" class="control-label  requiredField">
        Text
        <span class="asteriskField">*</span>
    </label> <div class="controls ">
    <textarea class="textarea form-control" cols="40" id="id_text" maxlength="500" name="text" rows="10">

    </textarea> 
    </div> 
  </div>

  <input class="btn btn-primary" type="submit" name="reminder_form" value="Send" />
</form> 

【讨论】:

  • 尝试了至少 5 次,问题出在单表单上,而不是表单集,当我提交表单集时一切正常,但是当表单出现错误时
  • 尝试访问form.errors以检查错误是什么,甚至在上下文中也可以尝试分别处理表单集和表单以尝试准确定位错误。
  • form.errors 为空。如果我提交的是有效表单,那没关系,但是当表单为空时,我会收到该错误
  • 这取决于您是要忽略空表单并保存所有其他表单,还是要引发验证错误而不保存任何数据
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2013-04-01
  • 1970-01-01
  • 2015-03-14
  • 2011-02-01
  • 2014-12-01
相关资源
最近更新 更多