Django视图数据渲染至HTML问题:无法展示主题内容
问题排查与修复方案
核心问题分析
你的代码存在3个关键错误导致数据无法渲染:
- 模板变量访问错误:直接使用字段名(如
{{lesson_no}})而非通过上下文对象(topic_detail)访问属性 - 不存在的字段引用:模板中使用了Model未定义的
book_text_explination字段 - 错误的循环遍历:
topic_detail是单个模型对象(通过get()获取),不能用for循环遍历
另外还有一些代码规范问题,一并修正。
修正后的代码
1. 修正Model(规范类名、字段拼写与格式)
class BookExplanation(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(max_length=250, null=True, blank=True, unique=True) lesson_no = models.CharField(max_length=255) book_text = models.TextField(blank=False, null=False) # 可选:添加get_absolute_url方法,方便生成详情页链接 def get_absolute_url(self): return reverse('topic_detail', kwargs={'slug': self.slug})
2. 修正View(语义化参数名)
def topic_detail(request, slug): topic_detail = BookExplanation.objects.get(slug=slug) return render(request, 'blog/topic_detail.html', {'topic_detail': topic_detail})
3. 修正URL配置(匹配View的参数名)
path('', books_list, name="books_list"), path('book_topics/', book_topics, name="book_topics"), path('book_topics/<slug:slug>/', topic_detail, name='topic_detail'),
4. 修正HTML模板(正确访问对象属性)
{% block content %} <div class="container"> <p>{{ topic_detail.lesson_no | safe }}</p> <p>{{ topic_detail.book_text | safe }}</p> <!-- 移除不存在的book_text_explination字段,或在Model中添加该字段 --> </div> {% endblock %} <!-- 单个对象无需循环,直接展示属性即可 --> <ul> <li>{{ topic_detail.lesson_no }}</li> <li>{{ topic_detail.title }}</li> <li>{{ topic_detail.book_text | truncatechars:50 }}</li> </ul>
额外说明
- 确保你的
slug字段已经正确生成(可以通过Django Admin手动填写,或在Model中重写save()方法自动生成) - 如果需要展示多个主题列表,应该在对应的View中使用
BookExplanation.objects.all()获取QuerySet,再传递给模板用for循环遍历
内容的提问来源于stack exchange,提问作者Syed Shehab Ali
相关产品推荐
相关产品推荐

