Добавить пользователя запроса в InlineFormSet: TypeError: __init __ () получил неожиданный аргумент ключевого слова 'пользователь' - PullRequest
2 голосов
/ 07 мая 2020

Я использую InlineFormSetView из extra_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'

1 Ответ

0 голосов
/ 08 мая 2020

Решение, которое я нашел, заключается в обработке формы в представлении с использованием метода formset_valid.

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