首页 > 解决方案 > Django - 如何在管理表单中设置请求?

问题描述

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

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

总之,有没有办法将请求传递给管理表单?

标签: djangodjango-formsdjango-admin

解决方案


get_form()方法只返回类,而不是它的实例。表单的实例化隐藏在 的add_viewchange_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_formsave_model方法。


推荐阅读