Как переопределить поле формы в CreateView
В форме модели я могу переопределить поле формы следующим образом
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))
Как я могу использовать ту же функциональность в представлении на основе классов CreateView
, чтобы я мог переопределить поле формы?
Я старался get_form_kwargs
а также get_form
но все напрасно. Нужно ли создавать модель формы?
2 ответа
Вы можете переопределить get_form_kwargs
и передать user
в kwargs
толковый словарь. Тогда в вашем __init__()
method, set your field on the form.
views.py
Пройти user
в kwargs
переопределив 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__()
метод. In that, pop the user
ключ от 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))
Чтобы использовать форму модели в своем представлении, установите 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