You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django遍历Objectives模型生成HTML元素失败求助

Django待办数据渲染问题修复方案

本地存储了4条Objectives模型数据,但模板无法正常渲染出task-item元素,核心问题是视图传递的上下文变量与模板使用的变量不匹配,同时模板字段名和模型字段名不一致,Shell查询能正常获取到数据,以下是具体问题分析和修复方案:


原代码情况

models.py

class Objectives(models.Model):
    target = models.CharField(max_length=50)
    description = models.TextField(max_length=300)
    time_left= models.DateField()
    gamemodes= models.ForeignKey(User, on_delete=models.CASCADE) 

views.py

"""@login_required"""
def user_obj(request):
    user_obj= Objectives.objects.filter(gamemodes__username="test1")
    print("__________________________________________________________")
    print(user_obj)  # Add this line for debugging
    return render(request, 'user_obj.html', {'user_obj': user_obj})

实际使用的user_obj.html模板

<html>
<body>
    {% for task in user_tasks %}
        <div class="task-item">
            <h3>{{ task.name }}</h3>
            <p>{{ task.description }}</p>
            <p>Due Date: {{ task.due_date|date:"F j, Y" }}</p>
        </div>
        {% endfor %}
</body>
</html>

Shell查询结果

user_tasks = Objectives.objects.filter(gamemodes__username="@test1")
>>> for i in user_tasks:
...     print(i.gamemodes)
... 
@test1
@test1
@test1
@test1

问题关键点

  1. 上下文变量不匹配:视图传递的变量是user_obj,但模板遍历的是user_tasks
  2. 字段名不匹配:模板用name/due_date,但模型对应字段是target/time_left
  3. 用户名过滤不一致:视图里过滤条件是"test1",但Shell查询用的是"@test1",可能导致数据查询不到

修复方案

1. 统一上下文变量名并修正过滤条件

修改views.py,把传递的变量名改成模板使用的user_tasks,同时匹配Shell里的用户名格式:

from django.contrib.auth.decorators import login_required

@login_required  # 去掉注释符号,确保登录验证生效
def user_obj(request):
    # 匹配Shell的用户名格式,加上@前缀
    user_tasks = Objectives.objects.filter(gamemodes__username="@test1")
    print(user_tasks)
    return render(request, 'user_obj.html', {'user_tasks': user_tasks})

2. 修正模板字段名,匹配模型字段

修改user_obj.html,把模板里的字段替换成模型实际存在的字段:

<html>
<body>
    {% for task in user_tasks %}
        <div class="task-item">
            <h3>{{ task.target }}</h3>
            <p>{{ task.description }}</p>
            <p>Due Date: {{ task.time_left|date:"F j, Y" }}</p>
        </div>
    {% empty %}
        <!-- 增加空数据提示,方便调试 -->
        <p>暂无待办任务</p>
    {% endfor %}
</body>
</html>

3. 可选:优化模型字段名(语义化调整)

如果觉得模型字段名不够直观,可以修改为更语义化的名称(修改后需要执行数据库迁移):

class Objectives(models.Model):
    name = models.CharField(max_length=50)  # 替换原target
    description = models.TextField(max_length=300)
    due_date = models.DateField()  # 替换原time_left
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="objectives")  # 替换原gamemodes

执行迁移命令:

python manage.py makemigrations
python manage.py migrate

修改后视图和模板也要对应调整字段名即可。

内容的提问来源于stack exchange,提问作者user20856357

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:42:49