In model form I can override form field like so
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 class based view CreateView
, so that I can override form field?
I tried get_form_kwargs
and get_form
but all in vain. Do I need to create a model form?
You can override the get_form_kwargs
and pass the user
to kwargs
dictionary. Then in your __init__()
method, set your field on the form.
views.py
Pass the user
in kwargs
by overriding the 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
Now, override the __init__()
method. In that, pop the user
key from kwargs
and use that value to create your field.
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))
To use your model form in your view, set form_class
. In your case, you need to override get_form_kwargs
as well, so that you can pass user
to the form.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With