我有一个使用请求对象的表单:
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
总之,有没有办法将请求传递给管理表单?
最佳答案
get_form()
方法只返回类,而不是它的实例。表单的实例化隐藏在 add_view
中和 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
和 save_model
方法。
关于Django - 如何在管理表单中设置请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150994/