Подтвердить что ты не робот

Метод django __init__, вызывающий ошибку аргумента

Я хочу использовать django formset в своем представлении на основе класса. это вид,

class PeriodCreate(RequestPassingFormViewMixin, WammuCreateView):
    model = Chain
    template_name = 'dashboard/period_form.html'
    form_class = ChainForm

    def get_object(self):
        chain = Chain.objects.get(pk=self.kwargs['chain_pk'])
        return chain


    def get_success_url(self):
        return reverse('dashboard_period_list', kwargs={'chain_pk': self.object.chain.id, })                                                      


    def get_context_data(self, **kwargs):
        context = super(PeriodCreate, self).get_context_data(**kwargs)
        return context

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super(PeriodCreate, self).get_form_kwargs(*args, **kwargs)
        chain = get_object_or_404(Chain, pk=self.kwargs['chain_pk'])
        period = Period(chain=chain)
        kwargs['instance'] = period
        return kwargs

    def get(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        PeriodInlineFormSet = inlineformset_factory(Chain, Period,
                                                 form=PeriodInlineForm, 
                                                 can_delete=True,
                                                 extra=12)
        PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm, request=request, chain=self.object))
        period_formset = PeriodInlineFormSet()
        return self.render_to_response(
        self.get_context_data(form=form,
                              period_inline_formset=period_formset))
    def post(self, request, *args, **kwargs):
        self.object = Chain()
        form = self.get_form(self.form_class)
        PeriodInlineFormSet = inlineformset_factory(Chain, Period,
                                                        form=PeriodInlineForm,
                                                        can_delete=True, 
                                                        extra=5)
        PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm))

        if form.is_valid():
            self.object = form.save(commit=False)

            period_formset = PeriodInlineFormSet(request.POST, instance=self.object)

            if period_formset.is_valid():
                self.object.save()
                period_formset.save()
                return super(PeriodCreate, self).form_valid(form)
            else:
                return self.render_to_response(
                    context=self.get_context_data(form=form, period_inline_formset=period_formset))

        else:
            period_formset = PeriodInlineFormSet(request.POST,instance=self.object)
            return self.render_to_response(
                context=self.get_context_data(form=form, period_inline_formset=period_formset))

и это моя форма,

class PeriodForm(RequestPassingFormMixin, ModelForm):
    class Meta:
        model = Period
        fields = ['start_date', 'end_date', 'year', 'description']

и вот мой "RequestPassingFormMixin":

class RequestPassingFormMixin(object):

    def __init__(self, request, param, *args, **kwargs):
        self.request = request
        self.param = param
        super(RequestPassingFormMixin, self).__init__(*args, **kwargs)

но я получаю следующую ошибку:

TypeError at ....
__init__() takes at least 3 arguments (2 given)

эта ошибка указывает на шаблон, в котором я отобразил набор форм, поэтому я даю шаблон также (только часть, где я отобразил лес),

                  <tbody>
                        {% csrf_token %}
                        {{  period_inline_formset.management_form }}
                        {% for period_form in period_inline_formset %}
                            {% for hidden in period_form.hidden_fields %}
                                {{ hidden }}
                            {% endfor %}
                            {{period_form.pk}}
                            <tr>

                                <td>{{ period_form.start_date }}</td>
                                <td>{{ period_form.end_date }}</td>
                                <td>{{ period_form.year }}</td>
                                <td>{{ period_form.description }}</td>

                                <td> {% if period_formset.can_delete %}
                                    {{ period_form.DELETE }} {% endif %}</td>
                            </tr>
                        {% endfor %}
                 </tbody>

Я не привык использовать django formset, насколько я знаю, это не ошибка формы, а может быть, может быть, мне здесь что-то не хватает, но после долгих находок я не могу понять это...

4b9b3361

Ответ 1

У вас есть несколько проблем с вашим кодом; но для начала с фактической ошибкой - вы передаете только *args, **kwargs методу __init__ RequestPassingFormMixin, когда в определении требуется два дополнительных позиционных обязательных аргумента, а именно request и param.

Строка нарушения:

super(RequestPassingFormMixin, self).__init__(*args, **kwargs)

Вам действительно не нужна эта линия; так как вы ничего не игнорируете. Вы можете просто удалить его.

Фактически вы можете удалить весь этот mixin, если это все, потому что запрос и параметры доступны для всех классов, основанных на просмотре.

Кроме того, я понятия не имею, почему вы используете этот mixin в качестве родителя для вашего класса формы - там вообще не требуется; и он не будет делать то, что вы хотите.

У вас есть другие проблемы - вы переопределяете методы, но вы не меняете их функциональность, поэтому ваш код на самом деле ничего не делает.

У меня есть несколько предложений:

  • Если вы хотите создать представление на основе класса, совместимое с наборами форм, используйте django-extra-views.

  • Эта строка chain = Chain.objects.get(pk=self.request.session.get('chain_pk')) не устанавливает chain в любом месте класса, поэтому она эффективно теряется. Я не уверен, почему у вас есть эта строка.