首页 > 解决方案 > 如何在一个视图中拥有来自两个模型的两个对象

问题描述

我正在编写 django 博客应用程序,但我有问题如何在 Post 视图中获取 Comment 对象。使用 post 对象没有问题,因为我编写self.get_object()并完成了。问题是我如何获得评论对象。下面是我的代码。

这里是视图。

class PostDetail(generic.DetailView, FormMixin):
    template_name = 'post_detail.html'
    context_object_name = 'post'
    model = Post
    form_class = CommentForm

这是帖子模型:

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = RichTextUploadingField()

这是评论模型

class Comment(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = RichTextUploadingField()

标签: pythondjangoformsviewdjango-class-based-views

解决方案


我不知道你到底想做什么!但从被问到的情况下,我认为一种方法是使用这样的基于函数的视图(我没有尝试过,但我希望这个或类似的东西为你工作):

from django.shortcuts import render

def myview(request):
    post_objs = Post.objects.all()
    comment_objs = Comment.objects.all()

    mydict = {'posts':post_obj, 'comments':comment_obj}
    return render(request, 'myapp/myhtml.html', context=mydict)

考虑到您拥有的一对多关系,您还可以更进一步并传递您想要的确切数据

def myview(request, pk):
    the_post_obj = Post.objects.get(pk=pk)
    comment_objs = Comment.objects.filter(post=the_post_obj)

    mydict = {'the_post':the_post_obj,'comments':comment_objs}
    return render(request, 'myapp/myhtml.html', context=mydict)

使用您编写的任何视图,您现在可以转到 HTML 文件并以您想要的任何方式显示查询的数据。例如,您可以显示单个帖子的所有评论。不要忘记使用我上面写的第二个视图,您必须将帖子 PK 发送到视图(例如,您可以将其放在 HTML 文件中的链接中,以便当用户单击帖子时(即超链接),帖子PK经过查看功能,显示相关数据)。


推荐阅读