如何在CreateView中将表单(与通用内容类型连接到详细视图中的模型)连接到DetailView?

时间:2018-05-14 13:32:36

标签: django

我在DetailView中尝试使用FormMixins并获得了我的表单,但问题显然是他们根本没有相同的视图,或者至少不是相同的URL,所以这是如何工作的?我也尝试过在类中使用post()函数。

您如何在同一页面上的多个位置管理您需要的表单(最好使用基于内置类的视图)并仍然可以获得详细模型的ID?

编辑:实际上我们在堆栈上有完全相同的例子,堆栈如何能够在任何地方都有答案/评论表格?

Edit2:感谢Alasdair现在我有以下代码,但得到错误NOT NULL约束失败publish_answer.post_id

class PostDetailView(FormMixin, DetailView):
    model = Post
    form_class = AnswerForm
    template_name = 'main/postdetail.html'
    context_object_name = 'posts'

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context['form'] = AnswerForm(initial={'post': self.object})
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        form.save()
        return super(PostDetailView, self).form_valid(form)

answerform

class AnswerForm(forms.ModelForm):
    content = forms.CharField(widget=PagedownWidget())

    class Meta:
        model = Answer
        fields = ('content',)

URL

path('subject/<slug>', PostDetailView.as_view(), name='postdetail'),

我在Post的模型中有get_absolute_url,&#34; postdetail&#34;。

为了补充我得到的答案,我想告诉你这个https://docs.djangoproject.com/en/2.0/topics/class-based-views/mixins/#an-alternative-better-solution

1 个答案:

答案 0 :(得分:0)

在使用post保存表单后,您可以在created_by方法中设置form_validcommit=False字段。有关详细信息,请参阅the model form save method上的文档。

def form_valid(self, form):
    instance = form.save(commit=False)
    instance.created_by = self.request.user
    instance.post = self.object
    instance.save()
    return super(PostDetailView, self).form_valid(form)

您可能希望使用LoginRequiredMixin,以便只有已登录的用户才能访问该视图。

from django.contrib.auth.mixins import LoginRequiredMixin

class PostDetailView(LoginRequiredMixin, FormMixin, DetailView):

如果您希望所有用户都能够访问该视图,但只有登录用户才能提交表单,那么它会变得更加复杂。我将把它作为练习留给读者,但请注意using FormMixin with DetailView上的文档最终决定创建一个单独的视图来处理帖子请求。