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

时间:2019-01-11 17:02:20

标签: django django-forms django-admin

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

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

总而言之,有没有一种方法可以将请求传递给管理员表单?

1 个答案:

答案 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方法。