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

标签 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

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

最佳答案

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_formsave_model方法。

关于Django - 如何在管理表单中设置请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150994/

相关文章:

python - 音频流 Python 上的 Google 流式语音识别

python - 在 django admin 中保留用户的选择

django 注册 : what's the up-to date 'canonical' way to extend 'contrib.auth.models.User'

jquery - 重复的jquery ui问题

python - django admin 中的 save_model 和 save_formset 之间有什么区别

Django 将表单错误输出为 {{ form.as_table }} 中的表行

python - Django 名称错误 : name 'views' is not defined

Django 管理员 : ManyToManyField in list_editable?

python - Django SessionWizardView 不执行完成方法

python - 如何改变CharField的大小