2014-11-01 67 views
1

它會吃掉我的腦海。我創建了一個表單集:django ValidationError:u'ManagementForm數據丟失或被篡改'

TimingFormSet = modelformset_factory(Timing, form=TimingForm, extra=2) 

我有一個觀點:

class HospitalDoctorAddView(CreateView): 

    template_name = "hospital_doctor_add.html" 
    form_class = HospitalDoctorInfoForm 
    model = HospitalDoctor 
    success_url = "/hospital-profile/" 

    def get_context_data(self, **kwargs): 
     context = super(HospitalDoctorAddView, self).get_context_data(**kwargs) 
     context['formset'] = TimingFormSet 
     return context 

    def post(self, request, *args, **kwargs): 

     form = self.form_class(request.POST) 
     print "hellooww" 
     formset = TimingFormSet(request.POST, prefix='timings') 
     print "wow" 
     if form.is_valid() and formset.is_valid(): 
      print "this" 
      self.form_save(form) 
      self.formset_save(formset) 

     return render(request, self.template_name, { 
      'form': HospitalDoctorInfoForm, 
      'formset': formset}) 

    def form_save(self, form): 
     info = HospitalDoctor() 
     info.hospital = self.request.user 
     info.full_name = form.cleaned_data['full_name'] 
     info.expertization = form.cleaned_data['expertization'] 
     info.nmc_no = form.cleaned_data['nmc_no'] 
     info.save() 

    def formset_save(self, form): 
     frm = Timing() 
     frm.day = form.cleaned_data['day'] 
     frm.mng_start = form.cleaned_data['mng_start'] 
     frm.mng_end = form.cleaned_data['mng_end'] 
     frm.eve_start = form.cleaned_data['eve_start'] 
     frm.eve_end = form.cleaned_data['eve_end'] 
     frm.save() 

現在在我的模板:

<form method="post" action="">{% csrf_token %} 
{{form}} 
{{formset.management_form}} 
<table> 
    {% for form in formset %} 
     {{form}} 
    {% endfor %} 
</table> 

當我做到這一點顯示兩個表單。但是,當我嘗試保存或創建它會引發ValidationError:u'ManagementForm數據丟失或被篡改'。

我不知道什麼是錯的。真正需要幫助...

+0

'前綴='上request.POST timings'',那麼你應該這樣做對HTTP request.GET中:/ /stackoverflow.com/a/26674109/3033586所以'context ['formset'] = TimingFormSet(prefix ='timing)' – madzohan 2014-11-01 12:08:58

+0

爲什麼你重載'form_save'並指定'formset_save'?下面我已經把整個代碼。 – madzohan 2014-11-01 12:11:59

回答

0
class HospitalDoctorAddView(CreateView): 
    template_name = "hospital_doctor_add.html" 
    form_class = HospitalDoctorInfoForm 
    model = HospitalDoctor 
    success_url = "/hospital-profile/" # better override get_success_url like below and remove this 

    def get_success_url(self): 
     return reverse('app_name_namespace:url_name') # app_name_namespace in project.urls and url_name in your app.urls 

    def get_context_data(self, **kwargs): 
     context = super(HospitalDoctorAddView, self).get_context_data(**kwargs) 
     context['formset'] = TimingFormSet() 

     return context 

    def post(self, request, *args, **kwargs): 
     form = self.form_class(request.POST) 
     formset = TimingFormSet(request.POST, request.FILES) 
     if form.is_valid() and formset.is_valid(): 
      return self.form_valid(form, formset) 
     else: 
      return self.form_invalid(form, formset) 

    def form_valid(self, form, formset): 
     form.save() 
     formset.save() 

     return HttpResponseRedirect(self.get_success_url()) 

    def form_invalid(self, form, formset): 
     return self.render_to_response(
      self.get_context_data(
       form=form, 
       formset=formset, 
      ) 
     ) 

模板

<form method="post" action="">{% csrf_token %} 
    {{form.as_table}} 
    <table> 
     {{ formset }} 
    </table> 
</form> 
如果使用
相關問題