Django中如何在用户详情视图内获取对应用户关联的Posts文章?
实现方案
1. 修改ShowProfilePageView视图,补充用户帖子查询逻辑
你当前的视图已经拿到了当前页面对应的用户对象page_user,由于Posts模型通过author外键关联User模型,直接使用Django ORM的反向查询能力即可获取该用户发布的所有帖子,修改后的视图代码如下:
# user/application views.py 注意你原代码写错了文件后缀,该类属于视图层不是模型层 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger class ShowProfilePageView(DetailView): model=User template_name="users/profile.html" paginate_by = 5 def get_context_data(self, *args, **kwargs): context = super(ShowProfilePageView,self).get_context_data(*args, **kwargs) page_user = get_object_or_404(User, id=self.kwargs['pk']) context['page_user'] = page_user # 新增:查询当前用户发布的所有帖子,按发布时间倒序排列 all_posts = page_user.posts_set.all().order_by('-data_posted') # 匹配你原设置的paginate_by参数添加分页逻辑,不需要分页可以删掉以下分页代码 paginator = Paginator(all_posts, self.paginate_by) page = self.request.GET.get('page') try: user_posts = paginator.page(page) except PageNotAnInteger: user_posts = paginator.page(1) except EmptyPage: user_posts = paginator.page(paginator.num_pages) context['user_posts'] = user_posts return context
注意:如果你的Posts模型的author外键字段设置了
related_name参数,反向查询时把posts_set替换为你设置的related_name值即可,你当前代码未设置该参数,使用默认的posts_set即可。
2. 修改profile.html模板,渲染用户帖子内容
在原有用户基础信息展示代码下方,新增帖子遍历渲染逻辑即可,示例代码如下:
# template Profile.html <div class="content-section"> <div class="media"> <img class="rounded-circle account-img" src="{{ page_user.profile.image.url }}"> <div class="media-body"> <h2 class="account-heading">{{ page_user }}</h2> <h3 class="text-secondary">{{ page_user.profile.profile_description }}</h3> </div> </div> <!-- 新增:用户发布的帖子列表 --> <div class="user-posts mt-4"> <h3>该用户发布的帖子(共 {{ user_posts.paginator.count }} 篇)</h3> {% for post in user_posts %} <div class="card mb-3"> <div class="card-body"> <h5 class="card-title">{{ post.title }}</h5> <h6 class="card-subtitle mb-2 text-muted">发布时间:{{ post.data_posted|date:"Y-m-d H:i" }}</h6> <p class="card-text">{{ post.snippet }}</p> <div class="d-flex justify-content-between"> <span>分类:{{ post.category }}</span> <span>点赞数:{{ post.number_of_likes }} | 评论数:{{ post.number_of_comments }}</span> </div> <a href="{% url 'post_detail' post.id %}" class="btn btn-primary btn-sm mt-2">查看详情</a> </div> </div> {% empty %} <p class="text-muted mt-3">该用户暂未发布任何帖子</p> {% endfor %} <!-- 分页控件,不需要分页可以删掉 --> {% if user_posts.has_other_pages %} <nav aria-label="Page navigation"> <ul class="pagination"> {% if user_posts.has_previous %} <li class="page-item"><a class="page-link" href="?page={{ user_posts.previous_page_number }}">上一页</a></li> {% else %} <li class="page-item disabled"><span class="page-link">上一页</span></li> {% endif %} {% for num in user_posts.paginator.page_range %} {% if user_posts.number == num %} <li class="page-item active"><span class="page-link">{{ num }}</span></li> {% else %} <li class="page-item"><a class="page-link" href="?page={{ num }}">{{ num }}</a></li> {% endif %} {% endfor %} {% if user_posts.has_next %} <li class="page-item"><a class="page-link" href="?page={{ user_posts.next_page_number }}">下一页</a></li> {% else %} <li class="page-item disabled"><span class="page-link">下一页</span></li> {% endif %} </ul> </nav> {% endif %} </div> </div>
如果不需要分页功能,可以把视图里的分页逻辑删除,直接写
context['user_posts'] = page_user.posts_set.all().order_by('-data_posted')即可,模板里的分页控件也可以同步删除。
内容的提问来源于stack exchange,提问作者Koops
相关产品推荐
相关产品推荐

