Сохранение объекта с элементом набора форм И создание копии с новыми связанными элементами

Я пытаюсь сделать что-то вроде микса между Create и Update на объекте, который имеет внешние ключи (управляется как inline formset).

Обновление родительского объекта в форме (а также связанных с ним формсетов форм) работает нормально. Я также могу сохранить копию этого родительского объекта как новый экземпляр в БД, и это работает нормально. Однако я не могу понять, как также сделать копии набора форм в виде новых независимых объектов.

В принципе, когда все сказано и сделано, я хочу:

  • Foo (pk=1)
    • bar_1
    • bar_2 ...
    • bar_n
  • FooCopy (pk=2)
    • bar_1_copy ...
    • bar_n_copy

В настоящее время я могу изменить Foo, создать FooCopy, а также изменить bar_1 в bar_n... но не могу создать bar_1_copy и т.д.

Например:

class SoumissionUpdateView(LoginRequiredMixin, SideBarMixin, UpdateView):
    def form_valid(self, form, formset):
        # that saves any modification to the initial object, as well as the elements in the formset
        self.object = form.save()
        formset.instance = self.object
        formset.save()

        # this saves the parent object as a new instance. However no new formset objects are created in the db.
        self.object.pk = None
        self.object.save()
        formset.instance = self.object
        formset.save()                          # since those should be 2 different sets of instance in db
        return HttpResponseRedirect(self.get_success_url())

Насколько я понимаю, поскольку набор форм перед вторым сохранением ссылается на новый экземпляр, он должен сохранить их как новые объекты. Однако, похоже, что он ничего не сохраняет (поскольку наборы форм, даже после второго вызова formet.save(), все еще ссылаются на исходный родительский экземпляр).

Есть предложения, как мне сохранить независимые объекты набора форм, которые ссылаются на копию оригинального родителя?

Оказывается, проверка определения BaseInlineFormset (django.forms.model.py line 891) обнаруживает удобный kwargs для этого:

class BaseInlineFormSet(BaseModelFormSet):
    """A formset for child objects related to a parent."""
    def __init__(self, data=None, files=None, instance=None,
                 save_as_new=False, prefix=None, queryset=None, **kwargs):

Так, я фактически передаю в form_valid() 2 formet в этом случае, в def post():

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    form = self.get_form(self.get_form_class())
    formset = DetSoumFormset(self.request.POST, instance=self.object)
    formset_copy = DetSoumFormset(self.request.POST, instance=self.object, save_as_new=True)
    if form.is_valid() and formset.is_valid() and formset_copy.is_valid():
        return self.form_valid(form, formset, formset_copy)

А затем вместо 2-го formset.save() в вопросе выше, я вместо od formset_copy.save().

Да.

Вернуться на верх