如何在Django项目的index.html页面中接收来自admin管理后台的对象数据
问题根因
- 命名冲突:视图函数名
home与模型类名home完全重名,执行home.objects.all()时程序会将home识别为视图函数而非模型类,无法正常查询数据库中的数据 - 模型缺少
__str__方法:即便成功拿到数据,模板中直接输出{{ home }}只会显示默认的home object (序号)格式内容,无法展示你存入的实际字段值 - 不符合Django开发规范:模型类默认要求使用大驼峰命名,小写开头的类名极易和普通变量、函数产生命名冲突
修复步骤
- 修正
models.py:将模型类改为大驼峰命名,新增__str__方法定义实例默认显示内容
from django.db import models class Home(models.Model): HOME_CATEGORY = [ ('SR', 'Service'), ('VL', 'Vlog'), ('CR', 'course'), ] title = models.CharField(max_length=120) description = models.TextField() image = models.ImageField(upload_to='images') home_category = models.CharField(max_length=2, choices=HOME_CATEGORY) # 定义实例默认返回的内容 def __str__(self): return self.title
- 执行模型迁移命令,同步数据库结构
python manage.py makemigrations python manage.py migrate
如果admin后台注册了该模型,需要同步修改admin.py中注册的模型类名为Home,保证后台可正常使用
- 修正
views.py:修改导入的模型类名,建议同步修改视图函数名避免后续命名冲突
from django.shortcuts import render from .models import Home # 视图函数名改为index,避免和模型名混淆 def index(request): homeobject = Home.objects.all() return render(request, 'index.html', {'homes': homeobject})
修改完视图函数名后,需要同步修改项目urls.py中对应的路由指向,将原指向views.home的配置改为views.index
- 修正
index.html:直接调用需要展示的字段,可新增empty块快速排查是否成功拿到数据
{% for home in homes %} <h3>{{ home.title }}</h3> <p>{{ home.description }}</p> <p>分类:{{ home.get_home_category_display }}</p> <img src="{{ home.image.url }}" alt="{{ home.title }}"> {% empty %} <p>未查询到对应数据</p> {% endfor %}
get_home_category_display是Django自带的方法,可直接输出choices配置中对应的展示值,而非存储的简写字符
内容的提问来源于stack exchange,提问作者Ashok shah
相关产品推荐
相关产品推荐

