Как переопределить поле формы в 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
Другие вопросы по тегам