在模型表单中,我可以覆盖表单字段,如此
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
但都徒劳无功。我是否需要创建模型表单?
答案 0 :(得分:9)
您可以覆盖get_form_kwargs
并将user
传递给kwargs
词典。然后在__init__()
方法中,在表单上设置字段。
<强> 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 强>
现在,覆盖__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))
答案 1 :(得分:4)
要在视图中使用模型表单,请设置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