如何在CreateView中覆盖表单字段

Riz*_*taz 5 django

在模型形式中,我可以覆盖表单字段

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))
Run Code Online (Sandbox Code Playgroud)

如何在基于类的视图中使用相同的功能CreateView,以便我可以覆盖表单字段?

我试过get_form_kwargsget_form,但一切都是徒劳.我需要创建一个模型表单吗?

Rah*_*pta 10

您可以覆盖get_form_kwargs并传递userkwargs词典.然后在您的__init__()方法中,在表单上设置您的字段.

views.py

userkwargs被重写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 
Run Code Online (Sandbox Code Playgroud)

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)) 
Run Code Online (Sandbox Code Playgroud)


Ala*_*air 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
Run Code Online (Sandbox Code Playgroud)