How to override form field in CreateView

前端 未结 2 574
無奈伤痛
無奈伤痛 2020-12-15 12:00

In model form I can override form field like so

class waypointForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(waypointFor         


        
相关标签:
2条回答
  • 2020-12-15 12:41

    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)) 
    
    0 讨论(0)
  • 2020-12-15 12:59

    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
    
    0 讨论(0)
提交回复
热议问题