在模型形式中,我可以覆盖表单字段
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_kwargs和get_form,但一切都是徒劳.我需要创建一个模型表单吗?
Rah*_*pta 10
您可以覆盖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
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)
要在视图中使用模型窗体,请设置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)
| 归档时间: |
|
| 查看次数: |
4048 次 |
| 最近记录: |