2014-11-01 2 views
1

Его собираются съесть мой разум. Я создал formset: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

если вы используете 'префикс = 'timings'' на request.POST, то вы должны сделать это на request.GET HTTP://stackoverflow.com/a/26674109/3033586 так что 'context ['formset'] = TimingFormSet (prefix = 'timings)' – madzohan

+0

и почему вы переопределяете 'form_save' и задаете' formset_save'? Ниже я поставил весь код. – madzohan

ответ

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> 
Смежные вопросы