Django 2模板主键对象查询及模板无内容显示问题咨询
你的Django模板问题解决方案
问题1:如何在Django 2模板中查询主键对应的对象?
首先得明确:Django模板的设计原则是尽量避免在模板里写业务逻辑(包括直接查询数据库),最佳实践是在视图层完成数据查询,再把结果传递给模板渲染。具体步骤如下:
在视图中获取主键对应的对象
比如你要获取ScrumyUser中主键为user_id的对象,推荐用get_object_or_404(如果主键不存在会返回404页面,比直接用get()更安全):from django.shortcuts import get_object_or_404 from .models import ScrumyUser def user_detail(request, user_id): user = get_object_or_404(ScrumyUser, pk=user_id) return render(request, 'user_detail.html', {'user': user})在模板中直接使用传递过来的对象
模板里可以直接通过变量名访问对象的字段,注意choices类型的字段要用get_xxx_display获取友好名称:<h2>{{ user.fullname }}</h2> <p>角色:{{ user.get_role_display }}</p>
如果确实有特殊需求要在模板中查询(非常不推荐,会让模板逻辑混乱),可以自定义模板标签,但还是建议优先用视图传参的方式。
问题2:查询数据库后模板无法显示内容的排查方案
结合你提供的模型代码,我整理了几个常见的排查方向:
1. 检查视图是否正确传递了查询结果到模板上下文
这是最常见的问题!比如你要显示所有GoalStatus对象,视图必须把查询结果放进context里:
def goal_list(request): goal_statuses = GoalStatus.objects.all() # 执行数据库查询 # 一定要把查询结果加入context return render(request, 'goal_list.html', {'goal_statuses': goal_statuses})
2. 检查模板语法是否正确
- 如果是遍历列表,要使用
{% for %}标签,并且注意变量名和视图传递的一致,建议加empty分支判断是否真的没有数据:{% for status in goal_statuses %} <p>状态:{{ status.get_status_display }}</p> {% empty %} <p>暂无状态数据</p> {% endfor %} - 如果是单个对象,先判断对象是否存在再访问字段:
{% if user %} <p>用户名:{{ user.fullname }}</p> {% else %} <p>未找到用户</p> {% endif %}
3. 验证数据库中是否真的有数据
可以通过Django的shell确认查询是否返回结果:
python manage.py shell
然后执行查询:
from your_app.models import ScrumyUser, GoalStatus print(ScrumyUser.objects.all()) # 查看是否有数据 print(GoalStatus.objects.all())
如果shell里也没有数据,那就是数据库里还没添加记录,需要先创建测试数据。
4. 检查字段引用是否正确
你的ScrumyUser和GoalStatus用了choices字段,直接显示{{ user.role }}只会返回'O'/'A'这类字符,要显示友好名称(比如"Owner")必须用{{ user.get_role_display }},GoalStatus同理用{{ status.get_status_display }}。
内容的提问来源于stack exchange,提问作者stanley oguazu
相关产品推荐
相关产品推荐

