【问题标题】:How to override form field in CreateView如何覆盖 CreateView 中的表单字段
【发布时间】:2015-11-23 05:43:16
【问题描述】:

在模型表单中,我可以像这样覆盖表单字段

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_kwargsget_form,但都是徒劳的。我需要创建模型表单吗?

【问题讨论】:

标签: django


【解决方案1】:

您可以覆盖get_form_kwargs 并将user 传递给kwargs 字典。然后在您的 __init__() 方法中,在表单上设置您的字段。

views.py

通过覆盖get_form_kwargs(),在kwargs 中传递user

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

现在,覆盖__init__() 方法。在那里,从kwargs 中弹出user 键并使用该值来创建您的字段。

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)) 

【讨论】:

    【解决方案2】:

    要在视图中使用模型表单,请设置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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2020-09-16
      • 2017-05-04
      • 1970-01-01
      • 2022-11-02
      • 2012-02-06
      • 1970-01-01
      相关资源
      最近更新 更多