在 Django 1.6 中结合 DetailView 和 CreateView

Rus*_*pov 5 python django django-generic-views django-class-based-views

我有 2 个独立的模型,发布和评论。我使用 DetailView 来显示 Post 内容,我想使用 CreateView 在同一页面上显示评论创建表单。最干净的方法是什么?

唯一想到的是使用自定义视图,它既获取对象又处理评论表单,但这看起来太脏了:

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if request.POST:
        form = CommentForm(request.POST)
        # do comment form processing here
    return render(request, "post/post_detail.html", {
        "object": post, "comment_form": form})
Run Code Online (Sandbox Code Playgroud)

使用基于类的视图有什么干净的方法可以做到这一点吗?或者只是将帖子显示代码与评论处理代码分离的某种方法?

小智 3

一种选择是使用帖子的 DetailView 和模板标签来显示评论表单。将评论表单提交到 Comment CreateView,成功后重定向到 DetailView。

也就是说,如果表单无效,它可能会变得有点难看。在紧要关头,您始终可以从 CreateView 方法之一调用 DetailView 或其方法。但在我看来,这引入了更多的耦合而不是更少的耦合。或者,您可以拥有一个单独的实用程序函数,您可以从 CreateView 调用该函数,以便在评论表单出现错误时显示帖子。

另一种选择是使用 AJAX 来处理评论表单(在单独的 CreateView 中),而不是加载新页面。

最后,无论语言或框架如何,对需要显示一种对象类型并创建另一种对象类型的视图的解耦程度都会受到限制。