You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django模板多路径内容异常:仅首门课程可显示Lectures

解决Django模板无法展示非首门课程课时的问题

看起来你的问题核心出在Lecture模型的字段缺失以及模板逻辑的效率问题上,我来帮你一步步排查修复:

1. 修复Lecture模型的关键字段

看你贴的models.py代码,Lecture模型缺少两个核心部分:

  • CourseCategory关联的外键(模板里用到了c.course_category,但模型里没定义这个关联)
  • 模板中用到的lecture_titlecontentlinkfile字段

更新后的Lecture模型应该是这样:

class Lecture(models.Model):
    course = models.ForeignKey('Course', on_delete=models.CASCADE, related_name='lectures')
    # 添加和CourseCategory的关联,让课时能归属到对应分类下
    course_category = models.ForeignKey('CourseCategory', on_delete=models.CASCADE, related_name='lectures')
    # 补上模板里用到的字段
    lecture_title = models.CharField(max_length=255)
    content = models.TextField()
    link = models.URLField(blank=True, null=True)
    file = models.FileField(upload_to='lectures/', blank=True, null=True)

    def __str__(self):
        return self.lecture_title

注意:移除了default='',因为外键不能用字符串默认值,创建课时时必须手动关联对应的Course和CourseCategory。

修改后记得执行数据库迁移,让变更生效:

python manage.py makemigrations
python manage.py migrate

2. 优化模板逻辑(更高效且避免判断错误)

你当前的模板是先遍历所有分类,再遍历所有课时,然后判断归属——这种双重循环不仅效率低,还容易因为字段缺失导致判断失效。

利用Django的反向关联(我们给CourseCategory的外键加了related_name='lectures'),可以直接获取每个分类下的课时,修改后的模板代码:

<ul>
    {% for category in categories %}
        <li><strong>{{ category.course_category }}</strong></li>
        <!-- 直接遍历当前分类下的所有课时 -->
        {% for lecture in category.lectures.all %}
            <li>{{ lecture.lecture_title }}</li>
            <li>{{ lecture.content }}</li>
            {% if lecture.link %}
                <li>{{ lecture.link }}</li>
            {% endif %}
            {% if lecture.file %}
                <li><a href='{{ lecture.file.url }}'>download</a></li>
            {% endif %}
        {% empty %}
            <li>该分类下暂无课时</li>
        {% endfor %}
    {% endfor %}
</ul>

另外,{{ MEDIA_URL }}{{ lecture.file.url }}可以简化为{{ lecture.file.url }},Django会自动处理媒体文件的完整路径。

3. 验证数据关联是否正确

最后要确认你在添加新课时时:

  • 正确选择了对应的目标Course
  • 正确选择了该课程下的CourseCategory
    如果课时的coursecourse_category关联错误,模板自然无法展示对应内容。

完成以上步骤后,非首门课程的课时应该就能正常显示了。

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

火山引擎 最新活动