Как сохранить текущего пользователя в дочерней форме из 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})