2014-10-31 95 views
0

我有一个模型:Django的多种形式

class HospitalDoctor(models.Model): 


hospital = models.ForeignKey(Hospital) 
full_name = models.CharField(max_length=100, unique=True) 
expertization = models.CharField(max_length=50) 
nmc_no = models.CharField(max_length=20) 
timings = models.ManyToManyField('Timing', related_name='shift_timing') 
appointment = models.IntegerField(default=0) 

def __unicode__(self): 
    return self.full_name 

class Timing(models.Model): 
hospital = models.ForeignKey(Hospital) 
doctor = models.ForeignKey(HospitalDoctor) 
day = models.CharField(max_length=20) 
mng_start = models.IntegerField() 
mng_end = models.IntegerField() 
eve_start = models.IntegerField() 
eve_end = models.IntegerField() 

def __unicode__(self): 
    return self.day 

和我创建形式是:

class HospitalDoctorInfoForm(forms.ModelForm): 

class Meta: 
    model = HospitalDoctor 
    fields = ('hospital','full_name', 'expertization', 'nmc_no') 

class TimingForm(forms.ModelForm): 
class Meta: 
    model = Timing 
    fields = ('day','mng_start', 'mng_end', 'eve_start', 'eve_end') 

这里II要创建有关医生的信息,像他从HospitalDoctorInfoForm个人信息和TimingForm的一周时间表。

我想我应该在TimingForm使用表单集的时间7天的日程与像周日,周一一天的初始值...

我已经写了看法:

class HospitalDoctorAddView(CreateView): 

template_name = "hospital_doctor_add.html" 
model = HospitalDoctor 

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

    info_form = HospitalDoctorInfoForm(request.POST) 
    formset = modelformset_factory(request.POST, Timing, form=TimingForm, extra=7) 

    if formset.is_valid() and info_form.is_valid(): 
     self.formset_save(formset) 
     self.info_form_save(info_form) 

    context['formset'] = formset 

    return render(request, self.template_name, context) 

def formset_save(self, form): 
    frm = Timing() 
    frm.hospital = self.request.user 
    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() 

def info_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() 

当我这样做它会给出错误提示“创建不带'fields'属性的'ModelForm'或者'exclude'属性已被弃用 - TimingForm表单需要更新 ”。我需要帮助。这是我正在做的或者有另一种实现方式。

回答

2

https://docs.djangoproject.com/en/dev/ref/forms/models/#django.forms.models.inlineformset_factory

from django.core.urlresolvers import reverse 
from django.forms.models import inlineformset_factory 

TimingFormSet = inlineformset_factory(HospitalDoctor, Timing, form=TimingForm, extra=7) 

class HospitalDoctorAddView(CreateView): 
    ... 

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

     return context 

    def post(self, request, *args, **kwargs): 
     form = self.form_class(request.POST) 
     formset = TimingFormSet(request.POST, request.FILES) # request.FILES for files, remove if don't send 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): 
     self.object = form.save() 
     formset.instance = self.object 
     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 
      ) 
     ) 

    def get_success_url(self): 
     return reverse('some_app:url_name') 
+0

感谢名单的人帮我... – gamer 2014-10-31 08:27:59