将request.user对象发送到django中的基于类的通用视图到Modelform
-
24-10-2019 - |
题
因此,我的目标是能够在我的Modelform中过滤ModelChoiceField QuerySet,以仅包括请求。用户创建的ploce。
我的模态简单:
class PlaceEventForm(models.ModelForm):
class Meta:
model = Event
我想添加类似的东西:
def __init__(self, *args, **kwargs):
super(PlaceEventForm, self).__init__(*args, **kwargs)
self.fields['place'].queryset = Place.objects.filter(created_by=request.user)
但是,我似乎找不到一种在Modelform中访问请求的方法。
我的观点就像是这样:
class PlaceEventFormView(CreateView):
form_class = PlaceEventForm
template_name = 'events/event_create.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceEventFormView, self).dispatch(*args, **kwargs)
我不确定这是否接近我应该做的事情,但我尝试了:
def get_form_kwargs(self):
kwargs = super(PlaceEventFormView, self).get_form_kwargs()
kwargs.update({'place_user': self.request.user})
return kwargs
但是我有错误: 在里面()有一个意外的关键字参数'place_user'
对此有什么想法吗?还是可以想到一种在视图中过滤我的ModelChoiceField而无需将我的请求传递给Modelform的方法?
解决方案
您需要弹出键 user
从 kwargs
在 PlaceEventForm.__init__()
方法,以防止它去 ModelForm.__init__()
方法:
Views.py:
class PlaceEventFormView(CreateView):
form_class = PlaceEventForm
template_name = 'events/event_create.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceEventFormView, self).dispatch(*args, **kwargs)
def get_form_kwargs(self):
kwargs = super(PlaceEventFormView, self).get_form_kwargs()
kwargs.update({'place_user': self.request.user})
return kwargs
forms.py:
class PlaceEventForm(models.ModelForm):
class Meta:
model = Event
def __init__(self, *args, **kwargs):
user = kwargs.pop('place_user')
# now kwargs doesn't contain 'place_user', so we can safely pass it to the base class method
super(PlaceEventForm, self).__init__(*args, **kwargs)
self.fields['place'].queryset = Place.objects.filter(created_by=user)
其他提示
我在iPhone上,但要这样做:
def get_form(self, form_class):
form = super(MyView, self).get_form(form_class)
form.fields['place'].querset = Place....
return form
哇,很难!没有纵向支持!
要更新Yuji的Django 1.10+(包括Django 2.0+)的答案,请参见下面的示例(请注意更新的方法签名)。 Yuji的建议方法将QuerySet与其他业务逻辑保持一致,并有助于保持任何表格类扩展 models.ModelForm
干净直接。
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
form = super(MyView, self).get_form()
form.fields['place'].queryset = Place.objects.filter(created_by=self.request.user)
return form
短:
def get_form(self, form_class=None):
form = super(MyView, self).get_form(form_class)
form.fields['place'].queryset = Place.objects.filter(created_by=self.request.user)
return form
不隶属于 StackOverflow