Я использую Django 2.1 с python 3.6 и postgreSQL.
Мне нужно отобразить 3 разные формы в одном шаблоне.Поэтому я создал представление, в котором я поместил 3 формы, но это не показывает, что они заполнены, как если бы они использовали CBV с generic.UpdateView
.
. Мне нужно добавить текущую информацию о моделях, которые находятся в процессе разработки.обновляется внутри каждого поля формы.
Я также создал это, потому что я не нашел много информации о том, как создать FBV с несколькими формами в Django.Я предполагаю, что есть несколько вещей, которые не являются правильными в представлении, поэтому все предложения приветствуются.
Представление:
def project_update_view(request, pk):
project = Project.objects.get(pk=pk)
if request.method == 'POST':
general_form = UpdateProjectGeneralForm(request.POST)
investment_form = UpdateProjectInvestorDetailsForm(request.POST)
create_job_form = UpdateProjectAddWorkersForm(request.POST)
if general_form.is_valid():
general_form.instance.user = request.user
general_form.instance.history_change_reason = 'Project Updated'
general_form.save()
messages.success(request, 'Project updated!')
return HttpResponseRedirect(request.path_info)
if investment_form.is_valid():
investment_form.instance.user = request.user
investment_form.instance.history_change_reason = 'Investor Details Updated'
investment_form.save()
messages.success(request, 'Investment details updated!')
return HttpResponseRedirect(request.path_info)
if create_job_form.is_valid():
create_job_form.instance.project = project
create_job_form.instance.history_change_reason = 'New Job Added'
create_job_form.save()
messages.success(request, 'Job created!')
return HttpResponseRedirect(request.path_info)
else:
general_form = UpdateProjectGeneralForm()
investment_form = UpdateProjectInvestorDetailsForm()
create_job_form = UpdateProjectAddWorkersForm()
return render(request, 'webplatform/project_edit.html', {
'general_form': general_form,
'investment_form': investment_form,
'create_job_form': create_job_form,
'project': project,
})
Формы: (Чтобы избежать дополнительного кода, я простоположить одну форму. Другие имеют ту же структуру)
class UpdateProjectInvestorDetailsForm(forms.ModelForm):
class Meta:
model = Project
fields = ('investor_details', 'investment_percentage', 'investment_amount')
widgets = {
'investor_details': SummernoteWidget(attrs={'summernote': {
'placeholder': 'Add some details for the future investors here...'}}),
}
def __init__(self, *args, **kwargs):
# first call parent's constructor
super(UpdateProjectInvestorDetailsForm, self).__init__(*args, **kwargs)
# there's a `fields` property now
self.fields['investment_amount'].required = True
self.fields['investment_percentage'].required = True
self.fields['investor_details'].required = True
Шаблон: (это одна из форм, но все они следуют той же структуре)
<form method="post" enctype="multipart/form-data" novalidate>
{% csrf_token %}
<div class="row">
<div class="col-6">
{{ investment_form.investment_amount|as_crispy_field }}
</div>
<div class="col-6">
{{ investment_form.investment_percentage|as_crispy_field }}
</div>
<div class="col-12">
{{ investment_form.investor_details|as_crispy_field }}
</div>
</div>
<button type="submit" name="investment_form" class="btn btn-primary">Update investment details
</button>
</form>