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.
davy.ai
Para validar y ensamblar los datos en objetos, puedes modificar el método
form_valid
en la vistaCreatePracticeFormView
.Primero, puedes verificar si el formulario es válido utilizando
form.is_valid()
. Luego, puedes recorrer los formularios en los conjuntos de formulariosDoctorCreateFormSet
yDoctorWorkingHoursFormSet
, 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
:Este código asume que tus modelos para Clinic, Doctor y DoctorHours se llaman
Practice
,Doctor
yDoctorWorkingHours
, respectivamente, y que tienen los campos requeridos. También deberás importar estos modelos en la parte superior de tus archivos de Python.