Saltar al contenido

Desde la vista, ¿cómo paso “opciones” personalizadas al ChoiceField de un formulario?

Te recomendamos que revises esta solución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

los get_initial El método está hecho para completar el valor inicial de los campos de su formulario. No configurar los disponibles choices o para modificar sus campos attributes.

Para pasar con éxito sus opciones de su vista al formulario, debe implementar el get_form_kwargs método en su opinión:

class PairRequestView(FormView):
    form_class = PairRequestForm

    def get_form_kwargs(self):
        """Passing the `choices` from your view to the form __init__ method"""

        kwargs = super().get_form_kwargs()

        # Here you can pass additional kwargs arguments to the form.
        kwargs['favorite_choices'] = [('choice_value', 'choice_label')]

        return kwargs

Y en su forma, obtenga las opciones del argumento de los kwargs en el __init__ método y establezca las opciones en el campo:

class PairRequestForm(forms.Form):

    favorite_choices = forms.ChoiceField(choices=[], widget=RadioSelect, required=False)

    def __init__(self, *args, **kwargs):
        """Populating the choices of  the favorite_choices field using the favorites_choices kwargs"""

        favorites_choices = kwargs.pop('favorite_choices')

        super().__init__(*args, **kwargs)

        self.fields['favorite_choices'].choices = favorites_choices

Y voilá !

Otra forma sencilla de hacerlo sería:

class PairRequestView(FormView):
    form_class = PairRequestForm

    def get_form(self, *args, **kwargs):
         requester_obj = Profile.objects.get(user__username=self.request.user)
         favorites_set = requester_obj.get_favorites()
         form = super().get_form(*args, **kwargs)
         form.fields['favorite_choices'].choices = favorites_set
         return form

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *