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
обрабатывается, а затем возникает ошибка. Я не могу понять, почему.