2015-12-14 43 views
2

我在視圖中有兩種形式。一個htlm格式包含form和formset,其他html格式只包含單一格式。Django form ValidationError

當我試圖提交燎形式(提醒),我收到此錯誤:

[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> 
+0

https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform –

+0

首先,確保你包括你的模板管理形式。其次,它看起來像你已經忘記在request.POST:'block'中的'if'reminder_form'中使用前綴''form'form = form_class(request.POST)'。 – Alasdair

+0

我在兩個地方都添加了前綴(創建實例時的上下文方法和後期方法),我還添加了{{reminder.management_form}}。仍然面臨同樣的錯誤 – Rokas

回答

0

您需要在<form method='POST' action=''>之後加上這條線{{ 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> 
+0

嘗試了至少5次,問題是使用單一形式,而不是formset,當我提交formset時一切正常,但是當表單我面臨錯誤 – Rokas

+0

嘗試訪問'form.errors檢查錯誤是什麼,也可以嘗試在上下文中單獨處理formset和表單,以嘗試找到錯誤。 – DhiaTN

+0

form.errors爲空。如果我提交的是有效表單,那麼可以,但是當表單爲空時,我得到的錯誤是 – Rokas