У меня есть вариант использования, когда пользователь может либо обновить существующий встроенный набор форм, либо сохранить его как новый (который может быть или не быть отредактирован).При сохранении нового необходимо сохранить оригинал, чтобы у вас осталось 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})