首页 > 解决方案 > 将请求用户添加到 InlineFormSet:TypeError: __init__() got an unexpected keyword argument 'user'

问题描述

我正在使用InlineFormSetViewfromextra_views创建自定义内联表单。在表单保存时,我需要进行一些与请求用户相关的更改。所以表单中需要请求用户。根据我的发现,我想出了这个解决方案,但似乎get_formset_kwargs可以在其他地方使用。导致发生异常。我不太确定是什么原因。可能有另一种解决方案将请求用户添加到内联表单。

看法:

class MyModelSetsView(InlineFormSetView):
    model = MyModel
    inline_model = MySubModel
    form_class = MySubModelSetForm
    template_name = "update_sets.html"
    success_message = "Updated successfully."
    permission_required = []
    factory_kwargs = {
        'extra': 1,
    }

    def get_success_url(self):
        return self.object.get_absolute_url()

     def get_formset_kwargs(self):
         kwargs = super(MyModelSetsView, self).get_formset_kwargs()
         kwargs.update({'user': self.request.user})
         return kwargs

形式:

class MySubModelSetForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(PeakPeriodSetForm, self).__init__(*args, **kwargs)

例外:

 File "..\venv\lib\site-packages\extra_views\formsets.py", line 268, in get
    formset = self.construct_formset()
  File "...venv\lib\site-packages\extra_views\formsets.py", line 36, in construct_formset
    return formset_class(**self.get_formset_kwargs())
  File "...\venv\lib\site-packages\django\forms\models.py", line 897, in __init__
    super().__init__(data, files, prefix=prefix, queryset=qs, **kwargs)
  File "...\venv\lib\site-packages\django\forms\models.py", line 569, in __init__
    super().__init__(**{'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix, **kwargs})
TypeError: __init__() got an unexpected keyword argument 'user'

标签: djangodjango-formsdjango-views

解决方案


我发现的解决方案是使用formset_valid方法处理视图中的表单。

def formset_valid(self, formset):
    for form in formset:
        data= form.cleaned_data
        print(data)
    return super().formset_valid(formset)

推荐阅读