Django: ¿Múltiples formas posibles al usar FormView?

Recientemente aprendí los formularios Django mediante la subclasificación de FormView , donde el formulario deseado se asigna al atributo FormView.form_class . Cuando el formulario se valida, se invoca el método form_valid() (para ese formulario). Por ejemplo:

 from accounts.forms import SignUpForm, UpdateAccountForm, UpdateBillingForm class SignUpView(FormView): form_class = SignUpForm def form_valid(self, form): # code when form validates... 

Sin embargo, ahora tengo una situación en la que necesito tres formularios únicos en una página (con un solo formulario visible para el usuario a la vez). Entonces, me gustaría manejarlos todos en la misma Vista.

¿Son posibles las páginas de múltiples formas utilizando FormView? No estoy seguro de cómo manejarlo, tanto en términos de pasar varios formularios a la Vista (p. Ej., El otro UpdateAccountForm y UpdateBillingForm), así como distinguir cuál fue enviado / validado. Cúal seria la mejor manera?

Bueno, para lo que vale esto es lo que finalmente me funcionó, usando una vista genérica.

1) Agregué un campo de entrada oculto (llamado ‘acción’) a cada formulario individual en la página. Por ejemplo, este es el formulario para actualizar la información del usuario, que se encuentra en UserForm:

 
{% csrf_token %} {{ user_form.as_p }}

2) En mi lógica de vista, puedo distinguir los formularios aplicando un prefijo (por otras publicaciones SO y documentos Django). Luego, dependiendo de la ‘acción’ entrante, solo vinculo el formulario aplicable a la solicitud POST (por lo tanto, las validaciones no se aplican en todos ellos). En mi caso, tenía dos formularios definidos en forms.py, UserForm y BillingForm:

 from django.views.generic.edit import View from django.shortcuts import render from django.http import HttpResponse from accounts.forms import UserForm, BillingForm class AccountView(View): def get(self, request): # code for GET request... def post(self, request): #instantiate all unique forms (using prefix) as unbound user_form = UserForm(prefix='user_form') billing_form = BillingForm(prefix='billing_form') # determine which form is submitting (based on hidden input called 'action') action = self.request.POST['action'] # bind to POST and process the correct form if (action == 'edit_user'): user_form = UserForm(request.POST, prefix='user_form') if user_form.is_valid(): # user form validated, code away.. elif (action == 'edit_billing'): billing_form = BillingForm(request.POST, prefix='billing_form') if billing_form.is_valid(): # billing form validated, code away.. # prep context context = { 'user_form': user_form, 'billing_form': billing_form, } return render(request, 'accounts/account.html', context) 

Parece funcionar bien, espero que este sea el enfoque correcto (?)

Puede escribir una clase de python normal que imite la API del Form (al menos las partes útiles) y que contenga sus tres formularios. Detectar qué formulario ha sido enviado es solo una cuestión de agregar una entrada oculta con el identificador del formulario en cada formulario (sugerencia: use prefijos para sus formularios y use ese mismo prefijo como identificador).

La otra solución es usar una vista simple basada en la función, pero incluso allí todavía uso el mismo patrón de “envoltura de formulario” en lo que a mí respecta.