簡體   English   中英

如何在一個視圖中有兩個模型的兩個對象

[英]How can I have two objects from two models in one view

我正在編寫django博客應用,我在如何在Post視圖中獲取Comment對象時遇到問題。 使用post object沒問題,因為我編寫了self.get_object()並完成了操作。 問題是我如何獲得Comment對象。 下面是我的代碼。

這是視圖。

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()

我不知道您到底想做什么!但是從被詢問的內容來看,我認為一種方法是使用這樣的基於函數的視圖(我沒有嘗試過,但是我希望這樣做或與為您工作):

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將通過查看功能,並顯示相關數據。

您可以將DetailView更改為TemplateView並覆蓋get_context_data()。 請參閱: http//ccbv.co.uk/

或者,您可以使用for循環在模板中獲取與帖子相關的評論:

for comment in self.get_object().comments.all
    # do sth with the comment

您可以通過覆蓋detailView中的get_context_data來獲得注釋對象,如下所示-

def get_context_data(self,** kwargs):context = super()。get_context_data(** kwargs)context ['comment'] = self.get_object()。comments.all()返回上下文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM