2

I have a model:

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

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

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

I have written view:

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

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.

1 Answer 1

8

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')
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.