一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

怎样在用户未登录时取得指定用户的头像与资料信息

时间:2026-06-23 09:31:03 编辑:袖梨 来源:一聚教程网

本文详解如何通过 django 视图动态传递目标用户对象至模板,实现非登录状态下访问任意用户个人主页(含头像、用户名等),避免误用 request.user 导致的权限与数据混淆问题。

本文详解如何通过 django 视图动态传递目标用户对象至模板,实现非登录状态下访问任意用户个人主页(含头像、用户名等),避免误用 request.user 导致的权限与数据混淆问题。

在 Django 中,{{ user }} 模板变量默认指向当前登录用户(即 request.user)。若要在未登录状态访问他人主页时展示指定用户的资料(如头像、用户名),必须显式将目标用户对象传入模板——不能依赖 request.user。

✅ 正确做法:按用户 ID 动态获取并渲染

首先,在 views.py 中定义专用视图,根据 URL 中的 id(或 pk)参数查询对应用户:

from django.contrib.auth import get_user_modelfrom django.shortcuts import get_object_or_404from django.shortcuts import renderUser = get_user_model()def user_info(request, id):    user = get_object_or_404(User, pk=id)  # 安全获取用户,404 处理不存在情况    return render(request, 'posts/prof.html', {'user': user})

同时确保 urls.py 配置匹配该逻辑(推荐使用 pk 命名以符合 Django 惯例):

# urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [    path('users/<int:pk>/', views.user_info, name='user_info'),]

⚠️ 注意:原代码中 prof.html 模板直接使用 {{ user.profile.image.url }},这要求 User 模型必须存在关联的 profile 属性(如通过 OneToOneField 关联的 Profile 模型),且 Profile 模型中需定义 image = models.ImageField(...) 字段。若未配置,会触发 AttributeError。

? 模板优化:移除循环,专注单用户渲染

原始答案中建议用 {% for user in users %} 渲染多个用户卡片,但这适用于「用户列表页」;而 prof.html 实际是「单用户详情页」,应删除循环结构,直接使用传入的 user 对象:

<!-- prof.html -->{% extends "base.html" %}{% load static %}{% block content %}<div class="frame">  <div class="center">    <div class="profile">      <div class="image">        <div class="circle-1"></div>        <div class="circle-2"></div>        <div style="margin-left: -20px">          {% if user.profile.image %}            <img src="{{ user.profile.image.url }}" width="110" height="110" alt="{{ user.username }}'s avatar">          {% else %}            <img src="{% static 'images/default-avatar.png' %}" width="110" height="110" alt="Default avatar">          {% endif %}        </div>      </div>      <div style="margin-top: 30px"></div>      <div class="name">{{ user.username }}</div>      <div class="job">Visual Artist</div>      <div class="actions">        <button class="btn">Follow</button>        <button class="btn">Message</button>      </div>      <div class="sociic">        <a href="{% url 'home' %}"><i class="fa fa-telegram"></i></a>        <a href="#"><i class="fa fa-envelope-o"></i></a>        <a href="{% url 'home' %}"><i class="fa fa-linkedin-square"></i></a>        <a href="#"><i class="fa fa-github"></i></a>      </div>    </div>    <div class="stats">      <div class="box">        <span class="value">523</span>        <span class="parameter">Stories <i class="fa fa-pencil"></i></span>      </div>      <div class="box">        <span class="value">1387</span>        <span class="parameter">Likes <i class="fa fa-heart-o"></i></span>      </div>      <div class="box">        <span class="value">146</span>        <span class="parameter">Follower <i class="fa fa-thumbs-o-up"></i></span>      </div>    </div>  </div></div><style>  /* 保持原有 CSS 不变 */</style>{% endblock %}

? 关键注意事项

  • 空值防护:务必检查 user.profile.image 是否存在,避免模板报错(如上例中的 {% if %} 判断);
  • 静态资源兜底:为未上传头像的用户提供默认图像(如 default-avatar.png);
  • URL 命名规范:使用 path('users/<int:pk>/', ...) 而非 <int:id>,便于与 Django 内置通用视图兼容;
  • 权限无关性:该方案不依赖用户登录状态,get_object_or_404 仅校验数据库存在性,适合公开个人主页场景;
  • 关联模型验证:确认 User 模型已正确通过 OneToOneField 关联 Profile,并在 User 类中添加 profile 属性(如通过 @property 或 RelatedObjectDescriptor)。

通过以上改造,即可安全、稳定地在任意上下文(包括游客访问)中渲染指定用户的完整资料页,真正实现“点击即看”的用户体验。

热门栏目