python-在Django 1.6中结合DetailView和CreateView

codeday· 2019-11-23
本文来自 codeday ,作者 codeday
我有2个单独的模型,“发布”和“评论”.我使用DetailView显示帖子内容,并且我想使用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})

有没有使用基于类的视图做到这一点的干净方法?还是通过某种方式将帖子显示代码与评论处理代码分离?

最佳答案
一种选择是对帖子使用DetailView,并使用templatetag显示评论表单.让评论表单提交到Comment CreateView,然后在成功时重定向到DetailView.

也就是说,如果表格无效,可能会有点难看.在紧要关头,您始终可以从CreateView方法之一调用DetailView或其方法.但是,IMO引入了更多而不是更少的耦合.或者,您可以有一个单独的实用程序函数,如果注释表单有错误,可以从CreateView调用该函数以显示Post.

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

最后,无论使用哪种语言或框架,一个视图可以解耦一个需要显示一种对象类型并创建另一种对象类型的视图将受到限制.