【问题标题】:Show different Lessons inside different Modules in Learning Management System using Django使用 Django 在学习管理系统的不同模块中显示不同的课程
【发布时间】: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 %}

标签: python django


【解决方案1】:

module 对象已在上下文中可用。所以替换

{% for lesson in lessons %}

到

{% for lesson in module.lesson_set.all %}

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2011-09-17
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多