首页 > 解决方案 > Django CreateView 请求传递

问题描述

我正在使用django-better-form。多表单支持的好工具。一个问题是我想传递request给模型表单。使用kwargs.pop("request")我面临KeyError的 . 如何解决这个问题

我的forms.py:

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
        fields = '__all__'
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(FooForm, self).__init__(*args, **kwargs)

class BarForm(forms.ModelForm):
    class Meta:
        model = Bar
        fields = '__all__'


class FooBarMultiForm(MultiModelForm):
    form_classes = {
        'foo': FooForm,
        'bar': BarForm,
    }

views.py

class PassRequestToFormViewMixin:
    def get_form_kwargs(self):
        kwargs = super(PassRequestToFormViewMixin, self).get_form_kwargs()
        kwargs['request'] = self.request
        return kwargs

class FooCreateView(PassRequestToFormViewMixin, CreateView):
    form_class = FooBarMultiForm
    template_name = 'template.html'
    success_url = reverse_lazy('list')

标签: djangodjango-forms

解决方案


您可以通过get_forms_kwargs将请求传递给表单:

class SomeView(FormView):

    def get_form_kwargs(self):
        kwargs = super(SomeView, self).get_form_kwargs()
        kwargs['request'] = self.request
        return kwargs

并以以下形式捕获它:

class FooForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(FooForm, self).__init__(*args, **kwargs)        

    class Meta:
        model = Foo
        fields = '__all__'


class BarForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
       self.request = kwargs.pop("request")  # Need to pop here as well, even if you don't need it
       super(BarForm, self).__init__(*args, **kwargs) 

    class Meta:
        model = Bar
        fields = '__all__'


class FooBarMultiForm(MultiModelForm):
    form_classes = {
        'foo': FooForm,
        'bar': BarForm,
    }

    def get_form_args_kwargs(self, key, args, kwargs):
        fargs, fkwargs = super(FooBarMultiForm, self).get_form_args_kwargs(key, args, kwargs)  # call super
        fkwargs.update({'request': kwargs.get('request')})  # update form kwargs with request
        return fargs, fkwargs

推荐阅读