Django -如何在管理表单中设置请求?

fruv7luv  于 2023-03-20  发布在  Go
关注(0)|答案(2)|浏览(146)

我有一个使用request对象的表单:

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

总而言之,是否有办法将请求传递到管理表单?

xdnvmnnf

xdnvmnnf1#

get_form()方法只返回类,而不是它的示例。表单的示例化隐藏在ModelAdminadd_viewchange_view方法中。您可以通过在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_formsave_model方法。

b1zrtrql

b1zrtrql2#

对我有用!我可以像self.request一样访问Form示例中的request

def get_form(self, request, *args,  **kwargs):
    form = super().get_form(request, *args, **kwargs)
    form.request = request
    return form

相关问题