How to override a form field in CreateView

In model form, I can override the form field like this

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))

How can I use the same functionality in the class view CreateViewso that I can override the form field?

I tried get_form_kwargsand get_form, but in vain. Do I need to create a model form?

+4
source share
2 answers

You can override get_form_kwargsand pass the dictionary userto kwargs. Then in your method __init__()set the field in the form.

views.py

Pass userin kwargsby overriding 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

__init__(). user kwargs .

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)) 
+5

, form_class. get_form_kwargs, user .

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

All Articles