Как сохранить текущего пользователя в дочерней форме из formset?

Может кто подказать, как сейвить у дочерних formset данные? В моем случае, есть данный код:

class PostCreateView(CreateView):
model = Post
template_name = 'modules/post/post_create.html'
form_class = PostForm
success_url = None

def get_context_data(self, **kwargs):
    data = super(PostCreateView, self).get_context_data(**kwargs)
    if self.request.POST:
        data['formset'] = PostAttachmentFormSet(self.request.POST)
    else:
        data['formset'] = PostAttachmentFormSet()
    return data

def form_valid(self, form):
    context = self.get_context_data()
    formset = context['formset']
    with transaction.atomic():
        form.instance.created_by = self.request.user
        self.object = form.save(commit=False)
        form.save_m2m()
        if formset.is_valid():
            formset.instance = self.object
            formset.instace.created_by = self.request.user # не работает
                for form in formset:
                  form.instance = self.object
                  form.instance.created_by = self.request.user # так тоже не сейвится
                  form.save()
            formset.save()
    return super(PostCreateView, self).form_valid(form)

def get_success_url(self):
    return reverse_lazy('file_list')

Нужно сохранять пользователя в дочернюю форму. В моделях created_by присутствует. Облазил всё, поспрашивал в сообществе телеги - молчок.


Ответы (1 шт):

Автор решения: Razilator

В общем, всё оказалось довольно просто. Нужен был цикл for, который разбирает formset по полочкам. Исправленный код выглядит так:

class PostCreateView(SuccessMessageMixin, CreateView):
model = Post
template_name = 'modules/post/post_create.html'
form_class = PostForm
success_message = "Материал: %(title)s был добавлен на сайт!"

def get_context_data(self, **kwargs):
    context = super(PostCreateView, self).get_context_data(**kwargs)
    context['title'] = 'Добавление поста на сайт'
    context['formset'] = PostAttachmentFormSet(instance=Attachment())
    return context

def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST,  request.FILES)
    formset = PostAttachmentFormSet(request.POST)
    if form.is_valid() and formset.is_valid():
        return self.form_valid(form, formset)
    else:
        return self.form_invalid(form, formset)

def form_valid(self, form, formset):
    with transaction.atomic():
        current_user = self.request.user
        form.instance.created_by = current_user
        self.object = form.save(commit=False)
        attachments = formset.save(commit=False)
        for attachment in attachments:
            attachment.post_id = self.object.pk
            attachment.created_by = current_user
            attachment.save()
        form.save_m2m()
        form.save()
        print(form.cleaned_data, formset.cleaned_data)
    return super(PostCreateView, self).form_valid(form)

def form_invalid(self, form, formset):
    return self.render_to_response(
        self.get_context_data(form=form, formset=formset))

def get_success_url(self):
    print(self.object.type)
    if self.object.type == 1:
        return reverse_lazy('file_detail', kwargs={'cat_slug': self.object.category.slug, 'slug': self.object.slug, 'pk': self.object.pk})
    else:
        return reverse_lazy('post_detail', kwargs={'cat_slug': self.object.category.slug, 'slug': self.object.slug, 'pk': self.object.pk})
→ Ссылка