繁体   English   中英

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

[英]How do I keep the current user for a child form from a formset?

我不完全理解其中的逻辑。 在我的model中,附件有作者,帖子也有作者。 但是,我需要在 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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM