【问题标题】:django multiple forms with formsetsdjango 带有表单集的多种表单
【发布时间】:2014-12-27 09:36:38
【问题描述】:

我有一个模型:

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')

在这里,我想创建有关医生的信息,例如 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' 属性或 'exclude' 属性的 ModelForm 已被弃用 - 表单 TimingForm 需要更新 “。我需要帮助。我正在做的事情是正确的还是有其他方法可以实现这一点。

【问题讨论】:

    标签: django forms formset multiple-forms


    【解决方案1】:

    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')
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2011-09-17
      • 2015-02-28
      • 2011-06-10
      • 2015-11-08
      • 2015-02-15
      • 2021-07-13
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多