代码之家  ›  专栏  ›  技术社区  ›  Dalvtor

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

  •  0
  • Dalvtor  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  12
  •   Bernhard Vallant    6 年前

    这个 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