我有一个使用请求对象的表格:
class FooForm(forms.ModelForm):
class Meta:
model = Foo
fields = ('title', )
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
在我看来,每当我要实例化表单时,就如同执行以下操作一样简单:
class FooCreateView(LoginRequiredMixin, CreateView):
model = Foo
form_class = FooForm
def get_form_kwargs(self):
kwargs = super(FooCreateView, self).get_form_kwargs()
kwargs.update({'request': self.request})
return kwargs
现在,我想在管理面板中使用相同的表单,所以我要执行以下操作:
class FooAdmin(admin.ModelAdmin):
form = FooForm
但是轰!死了:
KeyError at /admin/foo/foo/add/
'request'
我尝试执行以下操作,但没有成功
def get_form(self, request, *args, **kwargs):
form = super(FooAdmin, self).get_form(request, *args, **kwargs)
form.request = request
kwargs['request'] = request
return form
总而言之,有没有一种方法可以将请求传递给管理员表单?
答案 0 :(得分:2)
get_form()
方法仅返回该类,而不返回其实例。表单的实例隐藏在add_view
的{{1}}和change_view
方法中。
您可以通过在ModelAdmin
方法中创建新的表单类来以某种方式解决此问题:
get_form
否则,如果您仅在保存期间需要访问权限,则可能还可以查看模型管理员的def get_form(self, request, obj=None, **kwargs):
FooForm = super(FooAdmin, self).get_form(request, obj, **kwargs)
class RequestFooForm(FooForm):
def __new__(cls, *args, **kwargs):
kwargs['request'] = request
return FooForm(*args, **kwargs)
return RequestFooForm
和save_form
方法。