Django заполнить форму, используя функцию на основе представления с несколькими формами - PullRequest
0 голосов
/ 28 января 2019

Я использую 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>

1 Ответ

0 голосов
/ 29 января 2019

Как сказал @mfackowiak в комментариях, проблема в том, что мои формы не соответствуют экземпляру модели, которую я хочу редактировать, поэтому мне просто нужно было изменить это:

general_form = UpdateProjectGeneralForm(request.POST)
investment_form = UpdateProjectInvestorDetailsForm(request.POST)
create_job_form = UpdateProjectAddWorkersForm(request.POST)

для этого:

general_form = UpdateProjectGeneralForm(request.POST, instance=project)
investment_form = UpdateProjectInvestorDetailsForm(request.POST, instance=project)
create_job_form = UpdateProjectAddWorkersForm(request.POST)

В качестве дополнения я увидел, что могу вызывать объект с get_object_or_404, поэтому я использую его в первой строке и из этого:

 project = Project.objects.get(pk=pk)

Я получил это:

 project = get_object_or_404(Project, pk=pk)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...