Django - Обработка двух форм в CBV

Последние несколько дней я бьюсь над тем, как обработать две формы в одном Class Based View. Я не могу заставить его работать. Я пытался играть с get_context_data и post, но я не могу заставить две формы работать.

В views.py метод get_context_data:

class UserViewReport(LoginRequiredMixin, TemplateView):
    """ View to access ONE report """

    model = Report
    template_name = 'tool/single-report.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        slug = self.kwargs['slug']
        report_id = get_object_or_404(Report, slug=slug)
        context['report_title'] = report_id.title
        reports_details = ReportDetails.objects.filter(report=report_id)
        dict_errors = {}
        missing_transporters = []
        
        #Getting supplements and transporter names
        supplements = Supplement.objects.filter(company=self.request.user.company)
        context['supplements'] = supplements

        #Company file form
        ''' Testing if COMPANY file already exists in REPORT database '''
        if not CompanyFile.objects.filter(report=report_id).exists():
            context['company_form'] = CompanyFileForm(self.request.POST or None)
        #Transporter file form
        context['transporter_form'] = TransporterFileForm(self.request.POST or None)

И метод post:

  def post(self, request, *args, **kwargs):
        report_id = get_object_or_404(Report, slug=self.kwargs['slug'])
        transporter_form = TransporterFileForm(request.POST, request.FILES)
        company_form = CompanyFileForm(request.POST, request.FILES)


        if transporter_form.is_valid():
            obj = transporter_form.save()
            transporter_name = request.POST.get('transporter_name')
            transporter = get_object_or_404(Transporter, name=transporter_name)
            cd = transporter_form.cleaned_data
            file_name = cd.get('file')
            transporter_file = TransporterFile.objects.filter(pk=obj.pk).update(name=file_name,
                                                                                transporter=transporter,
                                                                                report=report_id,
                                                                                company=report_id.company,
                                                                                user=request.user)
            return redirect('tool:single-report', slug=self.kwargs['slug'])


        elif company_form.is_valid():
            obj = company_form.save()
            cd = company_form.cleaned_data
            file_name = cd.get('file')
            company_file = CompanyFile.objects.filter(pk=obj.pk).update(name=file_name,
                                                                        user=request.user,
                                                                        company=report_id.company,
                                                                        report=report_id)
            return redirect('tool:single-report', slug=self.kwargs['slug'])

        return render(request, self.template_name, {'company_form': company_form, 'transporter_form': transporter_form})

И мои формы, если необходимо:

class TransporterFileForm(forms.ModelForm):

    class Meta:
        model = TransporterFile
        fields = ('file', 'transporter' )
        widgets = {
        'file': forms.FileInput(attrs={'onchange': 'submit();',
                                       'name': 'transporter_form'})
        }



class CompanyFileForm(forms.ModelForm):
    class Meta:
        model = CompanyFile
        fields = ('file', )
        widgets = {
        'file': forms.FileInput(attrs={'onchange': 'submit();',
                                       'name': 'company_form'})
        }

Выдержка из моего шаблона:

                <div class="bg-gray-50 px-5 py-3">
                    <div class="text-sm">
                        {% if company_file_exists %}
                        <li>Fichier déjà uploadé</li>
                        {% else %}
                        <form enctype="multipart/form-data" method="post">
                            {% csrf_token %}
                            <li
                               class="font-medium text-cyan-700 hover:text-cyan-900"> {{ company_form.file.as_widget }}</li>
                        </form>
                        {% endif %}
                    </div>
                </div>
            </div>


        </div>


        <p>
            Liste des transporteurs pour cette société :
        <ul>
            {% for transporter in missing_transporters %}
                <li>{{ transporter }}</li>
                <form enctype="multipart/form-data" method="post">
                    {% csrf_token %}
                    {{ transporter_form.file.as_widget }}
                    <input type="hidden" name="transporter_name" value="{{ transporter }}" id="transporter_name">
                </form>
                </ul>
            {% endfor %}

С этим кодом transporter_form работает без проблем. Но company_form не работает. Я попробовал отладить свой код, и даже когда я пытаюсь использовать company_form, transporter_form обрабатывается, а затем возникает ошибка. Я не могу понять, почему.

Вернуться на верх