Django获取已登录用户数据库信息并在HTML展示,解决空白页问题
问题根因
你当前页面空白是因为视图查询返回的info数据集为空,同时存在几处逻辑错误:
- 过滤条件类型不匹配:
request.user是Django的User对象,不是姓名字符串,你用它和first_name字段做匹配,永远找不到符合条件的数据 - 模型缺少用户关联逻辑:当前
Info表没有和系统用户表绑定,仅靠名字匹配很容易出现重名冲突,也不符合“仅查看自己信息”的安全要求 - 模板路径不匹配:视图里指定渲染的是
profile/show.html,但你实际的模板文件命名是info.html,如果路径配置不对也会导致渲染异常(你没报错大概率是本地文件命名写错了)
修正方案
1. 调整模型(推荐方案,符合设计规范)
修改models.py,添加外键关联系统用户,避免重名问题:
from django.contrib.auth import get_user_model User = get_user_model() class Info(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_info") first_name = models.CharField(max_length=120) last_name = models.CharField(max_length=120) phone = models.CharField(max_length=10)
修改后执行python manage.py makemigrations和python manage.py migrate命令同步数据库结构,后续存储用户表单数据时,要把当前登录用户赋值给Info的user字段再保存。
2. 修正视图逻辑
修改views.py,调整查询逻辑,同时加登录校验避免未登录用户访问异常:
from django.contrib.auth.decorators import login_required @login_required def show(request): # 关联用户后直接用user字段过滤,精准查询当前用户的信息 info = Info.objects.filter(user=request.user) # 注意模板路径要和实际文件对应,如果你模板叫info.html就改成对应路径 return render(request, 'profile/info.html', {'info': info})
如果你暂时不想改模型,临时修复可以把过滤条件改成filter(first_name=request.user.first_name),但非常不推荐这种写法,重名就会出现数据泄露问题。
3. 模板优化(可选,不影响基础展示)
你的模板里没有<ul>标签包裹列表项,属于语义不规范,不会导致空白,可以按需调整,添加空数据提示避免完全空白:
<h1> Profile </h1> <br><br> {% if user.is_authenticated %} <ul> {% for info in info %} <li>First Name: {{ info.first_name }}</li> <li>Last Name: {{ info.last_name }}</li> <li>Phone Number: {{ info.phone }}</li> {% empty %} <li>暂未保存您的个人信息</li> {% endfor %} </ul> {% endif %}
内容的提问来源于stack exchange,提问作者PeroPuri
相关产品推荐
相关产品推荐

