Estoy creando una aplicación de seguimiento de tickets de soporte y tengo algunos modelos que me gustaría crear desde una página. Los boletos pertenecen a un Cliente a través de ForeignKey. Las notas también pertenecen a Tickets a través de ForeignKey. Me gustaría tener la opción de seleccionar un Cliente (que es un proyecto completamente separado) O crear un nuevo Cliente, luego crear un Ticket y finalmente crear una Nota asignada al nuevo ticket.
Como soy bastante nuevo en Django, tiendo a trabajar de forma iterativa, probando nuevas funciones cada vez. He jugado con ModelForms pero quiero ocultar algunos de los campos y hacer una validación compleja. Parece que el nivel de control que estoy buscando requiere conjuntos de formularios o hacer todo a mano, con una tediosa página de plantilla codificada a mano, que estoy tratando de evitar.
¿Hay alguna característica encantadora que me falta? ¿Alguien tiene una buena referencia o ejemplo para usar conjuntos de formularios? Pasé todo un fin de semana en los documentos de la API para ellos y todavía no tengo ni idea. ¿Es un problema de diseño si descompongo y codifico todo a mano?
fuente
Respuestas:
Esto realmente no es demasiado difícil de implementar con ModelForms . Entonces, digamos que tiene los Formularios A, B y C. Imprime cada uno de los formularios y la página y ahora necesita manejar el POST.
Aquí están los documentos para la validación personalizada.
fuente
Hace un día estuve en la misma situación, y aquí están mis dos centavos:
1) Encontré posiblemente la demostración más corta y concisa de la entrada de modelos múltiples en una sola forma aquí: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
En pocas palabras: crea un formulario para cada modelo, envía ambos a la plantilla en una sola
<form>
, usandoprefix
keyarg y haz que la vista maneje la validación. Si hay dependencia, asegúrese de guardar el modelo "padre" antes que el dependiente y utilice la ID del padre para la clave externa antes de guardar el modelo "hijo". El enlace tiene la demostración.2) Tal vez los conjuntos de formularios puedan ser golpeados para hacer esto, pero por lo que profundicé, los conjuntos de formularios son principalmente para ingresar múltiplos del mismo modelo, que pueden estar opcionalmente vinculados a otro modelo / modelos mediante claves externas. Sin embargo, parece que no hay una opción predeterminada para ingresar más de los datos de un modelo y eso no es para lo que parece estar destinado el conjunto de formularios.
fuente
Recientemente tuve un problema y descubrí cómo hacer esto. Suponiendo que tiene tres clases, Primaria, B, C y que B, C tienen una clave externa a primaria
Este método debería permitirle realizar cualquier validación que necesite, así como generar los tres objetos en la misma página. También he usado javascript y campos ocultos para permitir la generación de múltiples objetos B, C en la misma página.
fuente
El MultiModelForm de
django-betterforms
es un contenedor conveniente para hacer lo que se describe en la respuesta de Gnudiff . Envuelve los correos electrónicos regularesModelForm
en una sola clase que se utiliza de forma transparente (al menos para uso básico) como una forma única. He copiado un ejemplo de sus documentos a continuación.fuente
django-betterforms
y su clase MultiModelForm antes de encontrar su respuesta. Su solución se ve muy bien, pero parece que no se ha actualizado en un tiempo. ¿Sigues usando este @jozxyqk? ¿Algún problema?Actualmente tengo una solución alternativa funcional (pasa mis pruebas unitarias). En mi opinión, es una buena solución cuando solo desea agregar un número limitado de campos de otros modelos.
Me estoy perdiendo de algo ?
fuente
"Quiero ocultar algunos de los campos y hacer una validación compleja".
Empiezo con la interfaz de administración incorporada.
Construya el ModelForm para mostrar los campos deseados.
Amplíe el formulario con las reglas de validación dentro del formulario. Por lo general, este es un
clean
método.Asegúrese de que esta parte funcione razonablemente bien.
Una vez hecho esto, puede alejarse de la interfaz de administración incorporada.
Entonces puede jugar con múltiples formularios parcialmente relacionados en una sola página web. Este es un montón de plantillas para presentar todos los formularios en una sola página.
Luego, debe escribir la función de vista para leer y validar las diversas cosas del formulario y hacer los diversos objetos guardados ().
"¿Es un problema de diseño si descompongo y codifico todo a mano?" No, es mucho tiempo sin mucho beneficio.
fuente
De acuerdo con la documentación de Django, los conjuntos de formularios en línea tienen este propósito: "Los conjuntos de formularios en línea son una pequeña capa de abstracción en la parte superior de los conjuntos de formularios del modelo. Esto simplifica el caso de trabajar con objetos relacionados a través de una clave externa".
Ver https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets
fuente