django具有表单的多个表单 [英] django multiple forms with formsets

查看:190
本文介绍了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

我已经为此创建了表单:

and I have created form for this:

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的一周时间表。

Here I I want to create the information about doctor like his Personal info from HospitalDoctorInfoForm and his one week schedule from TimingForm.

我想我应该在TimingForm中使用formets进行7天的时间安排,初始值如星期日,星期一...

I think I should use formsets for timing in TimingForm for 7 days schedule with initial value of day like sunday, monday...

我有书面意见:

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需要更新
。我需要帮助。我正在做什么,还是有另一种方式来实现这个。

When I do this it gives the error saying " Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form TimingForm needs updating ". I need help. Is it right what I m doing or there is another way for implementing this.

推荐答案

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

这篇关于django具有表单的多个表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆