如何从表单集中保留子表单的当前用户



我不完全理解逻辑。在我的模型中,附件有一个作者,帖子也有一个作家。但是,我需要在Post和Attachment中保存两个当前用户。但只有当前用户保存到表单,而不是保存到表单集。

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
formset.instance.created_by = self.request.user #not working...
self.object = form.save(commit=False)
form.save_m2m()
if formset.is_valid():
formset.instance = self.object
formset.save()
return super(PostCreateView, self).form_valid(form)
def get_success_url(self):
return reverse_lazy('main')

使用CreateView解决了问题。事实证明,您必须使用FOR循环来打开父窗体中的每个嵌套窗体

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['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.id
attachment.created_by = current_user
attachment.save()
form.save_m2m()
form.save()
print(form.cleaned_data, formset.cleaned_data)
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, formset):
return self.render_to_response(
self.get_context_data(form=form, formset=formset))
def get_success_url(self):
return reverse_lazy('file_list')

相关内容

最新更新