Quiero implementar un simple FormWizard de 2 partes. Forma 1 se genera de forma dinámica por algo como esto:Django FormWizard con formularios dinámicos
class BuyAppleForm(forms.Form):
creditcard = forms.ChoiceField(widget = forms.RadioSelect)
type = forms.ChoiceField(widget = forms.RadioSelect)
def __init__(self,*args, **kwargs):
user = kwargs['user']
del kwargs['user']
super(BuyAppleForm, self).__init__(*args, **kwargs)
credit_cards = get_credit_cards(user)
self.fields['creditcard'].choices = [(card.id,str(card)) for card in credit_cards]
apple_types= get_types_packages()
self.fields['type'].choices = [(type.id,str(type)) for type in apple_types]
Esto creará dinámicamente un formulario con una lista de opciones disponibles.
Mi segunda forma, en realidad no quiero ninguna entrada. Solo quiero mostrar una pantalla de confirmación que contiene la información de la tarjeta de crédito, información de Apple y montos de dinero (total, impuestos, envío). Una vez que el usuario haga clic en Aceptar, quiero que comience la compra de la manzana.
Pude implementar la forma de una sola forma al pasar el objeto request.user en los kwargs. Sin embargo, con FormWizard, no puedo resolver esto.
¿Me estoy acercando mal al problema y el FormWizard no es la forma correcta de hacerlo? Si es así, ¿cómo puede el método Form __init__
acceder al objeto del usuario desde la solicitud HTTP?
Interesante. Gracias por señalar eso, Tom. – ayaz
Gracias por señalar FormPreview. Sin embargo, en mi caso, parte del problema está pasando en un valor adicional de ** kwargs (request.user como 'usuario') al __init__ del constructor de Formulario (necesario para la generación dinámica de formularios), y no veo cómo eso es posible con FormPreview. –
No estoy seguro de si sería útil (con FormPreview), pero algo que podría hacer en su código anterior es no poner ese código en el método __init__. p.ej. x = BuyAppleForm(), luego haga x.set_choices_for_user (request.user) antes de que se muestre. – Tom