Tengo una página de plantilla que espera dos formas. Si solo uso un formulario, las cosas están bien como en este ejemplo típico:
if request.method == 'POST':
form = AuthorForm(request.POST,)
if form.is_valid():
form.save()
# do something.
else:
form = AuthorForm()
Sin embargo, si quiero trabajar con varios formularios, ¿cómo hago para que la vista sepa que estoy enviando solo uno de los formularios y no el otro (es decir, todavía es una solicitud. sucedió)?
Esta es la solución basada en la respuesta donde la frase esperada y la frase prohibida son los nombres de los botones de envío para los diferentes formularios y la forma esperada y la frase prohibida son los formularios.
if request.method == 'POST':
if 'bannedphrase' in request.POST:
bannedphraseform = BannedPhraseForm(request.POST, prefix='banned')
if bannedphraseform.is_valid():
bannedphraseform.save()
expectedphraseform = ExpectedPhraseForm(prefix='expected')
elif 'expectedphrase' in request.POST:
expectedphraseform = ExpectedPhraseForm(request.POST, prefix='expected')
if expectedphraseform.is_valid():
expectedphraseform.save()
bannedphraseform = BannedPhraseForm(prefix='banned')
else:
bannedphraseform = BannedPhraseForm(prefix='banned')
expectedphraseform = ExpectedPhraseForm(prefix='expected')
Respuestas:
Tienes pocas opciones:
Ponga diferentes URL en la acción para los dos formularios. Entonces tendrá dos funciones de vista diferentes para lidiar con las dos formas diferentes.
Lea los valores del botón de envío de los datos POST. Puede saber en qué botón de envío se hizo clic: ¿Cómo puedo construir varios botones de envío con el formulario django?
fuente
Un método para referencia futura es algo como esto. La forma de frase prohibida es la primera forma y la forma de frase esperada es la segunda. Si se golpea al primero, se omite el segundo (lo cual es una suposición razonable en este caso):
fuente
handled = False
se actualizaTrue
cuando se encuentra un formulario compatible?Las vistas basadas en clases de Django proporcionan un FormView genérico, pero para todos los efectos, está diseñado para manejar solo un formulario.
Una forma de manejar múltiples formas con la misma URL de acción de destino usando las vistas genéricas de Django es extender la 'Plantilla Vista' como se muestra a continuación; Utilizo este enfoque con la frecuencia suficiente para convertirlo en una plantilla IDE de Eclipse.
La plantilla html tiene el siguiente efecto:
fuente
Necesitaba múltiples formularios que se validan independientemente en la misma página. Los conceptos clave que me faltaban eran 1) usar el prefijo de formulario para el nombre del botón de envío y 2) un formulario sin límites no activa la validación. Si ayuda a alguien más, aquí está mi ejemplo simplificado de dos formularios AForm y BForm usando TemplateView basado en las respuestas de @ adam-nelson y @ daniel-sokolowski y comentarios de @zeraien ( https://stackoverflow.com/a/17303480 / 2680349 ):
fuente
data = request.POST if prefix in next(iter(request.POST.keys())) else None
contrarioin
no funcionó.Quería compartir mi solución donde no se utilizan formularios Django. Tengo varios elementos de formulario en una sola página y quiero usar una sola vista para administrar todas las solicitudes POST de todos los formularios.
Lo que he hecho es que he introducido una etiqueta de entrada invisible para poder pasar un parámetro a las vistas para verificar qué formulario se ha enviado.
views.py
fuente
Esto es un poco tarde, pero esta es la mejor solución que encontré. Haces un diccionario de búsqueda para el nombre del formulario y su clase, también debes agregar un atributo para identificar el formulario, y en tus vistas debes agregarlo como un campo oculto, con el
form.formlabel
.Espero que esto ayude en el futuro.
fuente
Si está utilizando un enfoque con vistas basadas en clases y diferentes atributos de 'acción', quiero decir
Puede manejar fácilmente errores de diferentes formularios utilizando el
get_context_data
método sobrecargado , por ejemplo:views.py:
modelo:
fuente
ver:
modelo:
fuente
Aquí hay una manera simple de manejar lo anterior.
En Plantilla HTML ponemos Post
En vista
En URL Dar información necesaria como
fuente