es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django Formularios Anidados Dinámicos

Tengo 3 modelos: Clinic, Doctor, DoctorHours
Quiero crear un formulario dinámico que me permita crear esas instancias en un solo formulario
algo como esto:

  • Formulario Clinic
    — botón agregar doctor
    — Formulario Doctor
    —- botón agregar horario de doctor
    —- Formulario DoctorHours

— Formulario Doctor
—- botón agregar horario de doctor
—- Formulario DoctorHours
—- Formulario DoctorHours

Ayuda por favor

Mi mejor intento:
Vista:

class CreatePracticeFormView(FormView):
template_name = ‘admin/practices/create_form.html’
form_class = PracticeCreateForm
success_url = ‘/admin/emr/practice/’

def form_valid(self, form):

    print(self.request.POST)

    return super().form_valid(form)

Formularios:

class DoctorWorkingHoursForm(forms.Form):

week_day = forms.ChoiceField(choices=DoctorWorkingHours.WeekDay.choices)
start_time = forms.TimeField(required=True)
end_time = forms.TimeField()

DoctorWorkingHoursFormSet = forms.formset_factory(DoctorWorkingHoursForm, extra=0)

class DoctorCreateForm(forms.Form):

first_name = forms.CharField(required=True)
last_name = forms.CharField()
npi = forms.EmailField()
specialty = forms.ModelChoiceField(queryset=Speciality.objects.all())
credentials = forms.CharField()
hours = DoctorWorkingHoursFormSet()

DoctorCreateFormSet = forms.formset_factory(DoctorCreateForm, extra=0)

class PracticeCreateForm(forms.Form):

name = forms.CharField()
type = forms.CharField()
primary_contact_name = forms.CharField()
ehr = forms.ModelChoiceField(queryset=EHR.objects.all())
scheduling_extension = forms.ModelChoiceField(queryset=SchedulingExtension.objects.all())
primary_visit_type = forms.ModelChoiceField(queryset=VisitType.objects.all())
secondary_visit_type = forms.ModelChoiceField(queryset=VisitType.objects.all())
doctors = DoctorCreateFormSet()

DoctorCreateFormSet = forms.formset_factory(DoctorCreateForm, extra=0, formset=BaseDoctorCreateFormset)

Aquí obtengo los formularios en la plantilla donde puedo agregar dinámicamente DoctorForm y HourForm con jQuery y obtener esos datos en la vista

pero cómo validar y ensamblar estos datos en objetos es la gran pregunta.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para validar y ensamblar los datos en objetos, puedes modificar el método form_valid en la vista CreatePracticeFormView.

    Primero, puedes verificar si el formulario es válido utilizando form.is_valid(). Luego, puedes recorrer los formularios en los conjuntos de formularios DoctorCreateFormSet y DoctorWorkingHoursFormSet, verificando si cada formulario es válido y creando los objetos correspondientes si lo son.

    Aquí tienes un ejemplo de cómo puedes modificar el método form_valid:

    def form_valid(self, form):
        # Verificar si el formulario principal es válido
        if not form.is_valid():
            return self.form_invalid(form)
    
        practice = Practice.objects.create(
            name=form.cleaned_data['name'],
            type=form.cleaned_data['type'],
            primary_contact_name=form.cleaned_data['primary_contact_name'],
            ehr=form.cleaned_data['ehr'],
            scheduling_extension=form.cleaned_data['scheduling_extension'],
            primary_visit_type=form.cleaned_data['primary_visit_type'],
            secondary_visit_type=form.cleaned_data['secondary_visit_type']
        )
    
        for doctor_form in form.cleaned_data['doctors']:
            # Verificar si el formulario del médico es válido
            if not doctor_form.is_valid():
                return self.form_invalid(form)
    
            doctor = Doctor.objects.create(
                first_name=doctor_form.cleaned_data['first_name'],
                last_name=doctor_form.cleaned_data['last_name'],
                npi=doctor_form.cleaned_data['npi'],
                specialty=doctor_form.cleaned_data['specialty'],
                credentials=doctor_form.cleaned_data['credentials'],
                clinic=practice
            )
    
            for working_hours_form in doctor_form.cleaned_data['hours']:
                # Verificar si el formulario de las horas de trabajo es válido
                if not working_hours_form.is_valid():
                    return self.form_invalid(form)
    
                DoctorWorkingHours.objects.create(
                    doctor=doctor,
                    week_day=working_hours_form.cleaned_data['week_day'],
                    start_time=working_hours_form.cleaned_data['start_time'],
                    end_time=working_hours_form.cleaned_data['end_time']
                )
    
        return super().form_valid(form)
    

    Este código asume que tus modelos para Clinic, Doctor y DoctorHours se llaman Practice, Doctor y DoctorWorkingHours, respectivamente, y que tienen los campos requeridos. También deberás importar estos modelos en la parte superior de tus archivos de Python.

Comments are closed.