【发布时间】:2021-03-19 06:17:35
【问题描述】:
该项目是关于 LMS 的。学生可以从超级管理员指定的讲师上传的课程中学习。
我想获得与一个模块相关的所有课程。例如,模块 A 应该有 a 课和 b 课,而模块 B 应该分别有 c 课和 d 课。
模块 A 和 B 是由超级管理员创建的课程中的模块。课程 a、b、c 和 d 由教师通过 Django 管理仪表板添加。
myapp/Models.py
class Course(models.Model):
name = models.CharField(...)
class Module(models.Model):
name = models.CharField(...)
course = models.ForeignKey(Course, ...)
class Lesson(models.Model):
name = models.CharField(...)
module = models.ForeignKey(Module, ...)
myapp/views.py
def module(request, pk):
template = 'myapp/module.html'
module = get_object_or_404(Module, id=pk)
lessons = module.lesson_set.all()
context = {'lessons': lessons}
return render(request, template, context)
myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('lesson/<int:pk>/', views.lesson, name="lesson"),
]
myapp/module.html
在HTML中使用module.id使用for循环实现动态HTML手风琴,即模块名称显示为按钮,点击时下拉显示该手风琴内的课程列表
<div class="accordion accordion-flush" id="accordionFlushExample">
{% for module in modules %}
<div class="accordion-item">
<h2 class="accordion-header" id="flush-heading-{{module.id}}">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#flush-collapse-{{module.id}}" aria-expanded="false" aria-
controls="flush-collapse-{{module.id}}">
{{module.name}}
</button>
</h2>
<div id="flush-collapse-{{module.id}}" class="accordion-collapse collapse" aria-
labelledby="flush-heading-{{module.id}}" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">
<ol type="1">
{% for lesson in lessons %}
<li><a href="{% url 'lesson' lesson.pk %}">{{lesson.name}}</a></li>
{% endfor %}
</ol>
</div>
</div>
</div>
以下是原始手风琴 html 模板
<div class="accordion-item">
<h2 class="accordion-header" id="flush-headingOne">
<button class="accordion-button collapsed" type="button" data-bs-
toggle="collapse" data-bs-target="#flush-collapseOne" aria-
expanded="false" aria-controls="flush-collapseOne">
**Name of the Module Goes Here**
</button>
</h2>
<div id="flush-collapseOne" class="accordion-collapse collapse" aria-
labelledby="flush-headingOne" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">
<ol type="1">
<li><a href="#">**name of the lesson goes here**</a></li>
</ol>
</div>
</div>
</div>
我的实际结果
相同的课程在不同的模块中重复
我想要什么
不同的课程应该出现在不同的模块中。一个模块应显示与该模块相关的所有课程
我的模块截图
第 1 单元显示课头
第 2 单元显示课头
从上面的截图中,课程(头)在模块 1 和模块 2 中都重复了
【问题讨论】:
-
这一行
lessons = lesson.module_set.all()应该是lessons = module.lesson_set.all()对吧? -
是的,你是对的。现在进行更改
-
问题仍然令人困惑。在 url 中我可以看到模块/模块 ID,但在 html 中你显示了多个模块和相应的课程。在 HTML 中,您实际上想要的是显示所有模块和相应的课程或一个模块及其课程?
-
@itzMEonTV 不是真的,我仔细检查过。在单个模块中添加课程时代码运行正常,因此能够查看一个模块中的课程列表。但是当您添加多个模块并将课程添加到这个新模块时,模块一课程仍然在模块二中可见
-
既然你
module对象已经作为上下文存在,你可以在模板本身中将这一行{% for lesson in lessons %}重写为{% for lesson in module.lesson_set.all %}