django не может передать запрос в форму при использовании formset.Производит `__init __ (), получивший неожиданный аргумент ключевого слова 'request'` - PullRequest
0 голосов
/ 11 сентября 2018
#forms.py
class RequestModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(RequestModelForm, self).__init__(*args, **kwargs)

class BusinessForm(RequestModelForm):
class Meta:
    model = Business
    fields = ('title', 'stitle', 'gstin', 'address')

    def clean_gstin(self):
        user = self.request.user
        gstin = self.cleaned_data['gstin'].upper()
        if Business.objects.filter(owner=user, gstin=gstin).exists():
            raise  ValidationError("A Business with that GSTIN already exists")
        return gstin

#views.py
class BaseFormView(FormView):

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

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.save()
        return super(BaseFormView, self).form_valid(form)

    class Meta:
        abstract = True


class BusinessCreateView(BaseFormView):
    BusinessFormSet = formset_factory(BusinessForm, extra=3)
    form_class = BusinessFormSet
    success_url = '/dashboard'
    template_name = "business/business_create_form.html"

Все работает хорошо, если я установил extra=1 для formset_factory. Но когда extra = 2 или что-то больше 1, выдается ошибка: __init__() got an unexpected keyword argument 'request'

Я определил проблему здесь. Так как я набираю request внутри __init__ функции RequestModelForm (которая вызывается несколько раз, когда для параметра extra установлено значение больше 1). И нет request, так как он уже выскочил.

Я пытался сделать self.request = kwargs.get("request") вместо self.request = kwargs.pop("request"). Но это выдает еще одну ошибку 'BusinessForm' object has no attribute 'request'.

Как это побороть? Любая помощь?

1 Ответ

0 голосов
/ 11 сентября 2018

Вам нужно будет передать дополнительный kwarg request в форму, но BusinessFormSet должен иметь эту информацию явно. Перезапись get_form_kwargs метода в FormView не работает так, как вы описали, потому что он передаст все это как kwargs к тому, что вы определили как form_class.

См. https://docs.djangoproject.com/en/2.1/topics/forms/formsets/#passing-custom-parameters-to-formset-forms

Например, вероятно, что будет работать:

class BaseFormView(FormView):

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['form_kwargs'] = {'request': self.request}
        return kwargs
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...