Django: Сохранить новый встроенный набор форм на основе существующего - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть вариант использования, когда пользователь может либо обновить существующий встроенный набор форм, либо сохранить его как новый (который может быть или не быть отредактирован).При сохранении нового необходимо сохранить оригинал, чтобы у вас осталось 2 встроенных набора форм.Трудность, с которой я столкнулся, заключается в сохранении нового набора форм из существующего.Я не могу получить новую родительскую модель для связи с дочерними моделями.

Я подозреваю, что это как-то связано с идентификаторами набора форм (например: my_formset-0-id), которые (из того, что я понимаю) присутствуют только при редактировании fomset.И поэтому, когда я пытаюсь сохранить новый набор форм, он ожидает обновления, потому что идентификаторы присутствуют.Я думал, что одним из решений будет удаление полей id из набора форм, когда он входит как редактирование, но это кажется немного хакерским.Возможно, кто-то уточнит, действительно ли наборы форм ведут себя таким образом.

views.py

def pivot_report_post_modal(request, report_type=None, report_id=None):
    """View for a POST that creates a new pivot report view or edits an existing one
    """

    if report_type:  # new
        pivot_report = get_object_or_404(PivotReport, identifier=report_type)
        report_view = PivotReportView(pivot_report=pivot_report, default=False, client=request.user.client)
    elif report_id:  # edit
        report_view = get_object_or_404(PivotReportView, id=report_id, client=request.user.client)
        pivot_report = report_view.pivot_report
        report_type = pivot_report.identifier
    else:
        raise Http404

    FormSet = inlineformset_factory(PivotReportView, AndReportFilter, form=AndReportFilterForm, extra=0, min_num=0)

    if request.method == 'POST':
        data = json.loads(request.body.decode("utf-8"))
        formset_post = data['filters']

        form = ReportSetupForm(data, instance=report_view)
        formset = FormSet(formset_post, instance=report_view,
                      form_kwargs={'user': request.user, 'report_type': report_type})

        if form.is_valid():
            instance = form.save(user=request.user, pivot_report=pivot_report, commit=False)
            if formset.is_valid():
                if instance.temp_report:
                    PivotReportView.objects.filter(
                        client=request.user.client, pivot_report=pivot_report, temp_report=True
                    ).delete()
                report_view.label = 'Temp'

            report_view.clear_all()  # removes all foreign key relationships
            instance.save()
            create_report_view_items(instance, data)

            formset = FormSet(formset_post, instance=instance,
                              form_kwargs={'user': request.user, 'report_type': report_type})

            assert formset.is_valid()

            formset.save()

            context = {'success': True, 'id': report_view.id, 'label': report_view.label}
            return JsonResponse(context)

    return JsonResponse({'success': False})
...