子类化listview,用于将多个视图引用到一个模板

2024-10-04 09:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

比方说,在一个网站上有一个用户的个人资料页,它是一个博客网站。所以每个用户都有自己写的博客。因此,我希望个人资料页是这样的:它将显示有关该用户的详细资料,如用户名,电子邮件。而且他们写的所有博客都应该列在那里。现在我在这里有两个视图,一个用于详细的配置文件,另一个用于列出用户编写的博客。你知道吗

#view for detailed profile stuffs
class ProfileDetailView(DetailView):
    model = User

#view for listing blogs written by user
class UserPostListView(ListView):
    model = Post 
    paginate_by = 5

Post模型也是这样的:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

现在您可以看到,一个视图继承自ListView,另一个继承自DetailView。 为了使用这两个视图来呈现我想要的内容,我不能将两个视图传递给一个模板。所以我需要把他们。现在,因为我想保持分页,所以应该将UserPostListView子类化,并可能重写get\u context\u data()。那我该怎么做呢?我找不到满意的答案。我对django也很陌生。你知道吗

任何帮助都将不胜感激。你知道吗


Tags: 用户view视图forbymodel网站models
2条回答

您需要首先更新Post模型-向user添加一个外键字段,以便知道哪个用户发布了什么。下一步重写ProfileDetailView中的get\u context\u data()函数,并在上下文中传递用户编写的所有文章。 你的get\u context\u data()cal看起来像-

def get_context_data(self, **kwargs):
    context = super(ProfileDetailView, self).get_context_data(**kwargs)
    user = self.get_object()
    posts = Post.objects.filter(user=user)
    context.update({'posts': posts})
    return context

然后可以通过以下方式呈现模板上每个配置文件的帖子-

{% for post in posts %}
    {{ post.title }}
    {{ post.comment }}
{% endfor %}

我可以这样子类化ListView:

class UserPostListView(ListView):
    paginate_by = 5

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        self.usr = get_object_or_404(User, pk=self.kwargs['pk'])
        context['prof'] = self.usr.profile
        return context

    def get_queryset(self):
        return Post.objects.filter(author=self.usr)

相关问题 更多 >