Pregunta Cómo anular el campo de formulario en CreateView


En la forma de modelo, puedo anular el campo de formulario como tal

class waypointForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ModelChoiceField(queryset=Waypoint.objects.filter(user=user))

¿Cómo puedo usar la misma funcionalidad en la vista basada en clase? CreateView, para que pueda anular el campo de formulario?

Lo intenté get_form_kwargs y get_form Pero todo en vano. ¿Necesito crear un formulario modelo?


5
2017-08-28 14:13


origen


Respuestas:


Puede anular el get_form_kwargs y pasa el user a kwargs diccionario. Entonces en tu __init__() Método, establezca su campo en el formulario.

views.py

Pasa el user en kwargs anulando el get_form_kwargs().

class MyCreateView(CreateView):

    form_class = waypointForm

    def get_form_kwargs(self):
        kwargs = super(MyCreateView, self).get_form_kwargs()
        kwargs['user'] = self.request.user # pass the 'user' in kwargs
        return kwargs 

forms.py

Ahora, anula el __init__() método. En eso, pop el user clave de kwargs y usa ese valor para crear tu campo.

class waypointForm(forms.ModelForm):

    def __init__(self, *args, **kwargs): 
        user = kwargs.pop('user', None) # pop the 'user' from kwargs dictionary      
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ModelChoiceField(queryset=Waypoint.objects.filter(user=user)) 

7
2017-08-28 14:23



Para utilizar su formulario modelo en su vista, establezca form_class. En su caso, necesita anular get_form_kwargs así, para que puedas pasar user a la forma.

def CreateWaypointView(CreateView):
    ...
    form_class = WaypointForm

    def get_form_kwargs(self):
        kwargs = super(CreateWaypointView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

3
2017-08-28 14:16