Django中如何获取帖子作者头像并在用户帖子页正常显示
问题根因
模板中{{ username.profile.image.url }}无法生效的核心原因是:你在UserPostListView的get_queryset方法中查询到的目标用户是方法内部局部变量,没有被加入模板上下文,模板根本访问不到这个User实例;而{{ view.kwargs.username }}仅能拿到URL中的用户名字符串,不是模型对象,自然无法通过ORM关联关系取到绑定的Profile头像。
修复方案
1. 修改视图类,将目标用户对象传入模板上下文
编辑blog/views.py中的UserPostListView类,新增get_context_data方法传递用户对象,同时将查询到的用户存为类实例属性避免重复查库,修改后代码如下:
class UserPostListView(ListView): model = Post template_name = 'blog/user_posts.html' context_object_name = 'posts' paginate_by = 5 def get_queryset(self): # 将查询到的用户存为实例属性,供其他方法调用 self.target_user = get_object_or_404(User, username=self.kwargs.get('username')) return Post.objects.filter(author=self.target_user).order_by('-date_posted') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 将目标用户实例加入模板上下文 context['target_user'] = self.target_user return context
2. 修改模板中的头像引用
编辑用户帖子列表模板blog/user_posts.html,将头部头像的src属性替换为传入的用户实例对应路径:
<article class="media content-section"> <img class="img-thumbnail account-img mt-3" src="{{ target_user.profile.image.url }}"> </article>
注意事项
- Django的OneToOneField反向关联默认使用小写的模型名作为访问属性,你的Profile模型通过
user字段和User绑定,因此User实例可以直接通过.profile访问关联的Profile对象,无需额外查询。 - 请确认开发环境下已在项目根
urls.py中配置了MEDIA_URL对应的静态文件服务,否则本地访问图片会返回404。
内容的提问来源于stack exchange,提问作者CountDOOKU
相关产品推荐
相关产品推荐

