Django absolute url 在 html 模板中不工作
Django absolute url not working in html template
在我post这个问题之前,我尝试了几个解决方案,但没有vien,可能是因为我对django和web开发经验不多。
我想在面包屑导航菜单中显示课程名称。但是,它显示空白。使用Django 2.1.4,模型如下:
class Course(model.Model):
title = models.CharField(max_length=128)
description = RichTextUploadingField(default='No description available.')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('course-detail', kwargs={'pk': self.pk})
编辑:添加课程模型
课程模型与课程具有多对多关系。具体如下:
class Lesson(models.Model):
title = models.CharField(max_length=512)
content = RichTextUploadingField()
course = models.ManyToManyField(Course)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('lesson-detail', kwargs={'pk': self.pk})
views.py包含以下观点
class CourseListView(ListView):
model = Course
template_name = 'courses/courses.html'
context_object_name = 'courses'
paginate_by = 10
class CourseDetailView(DetailView):
model = Course
template_name = 'courses/course-detail.html'
class LessonDetailView(DetailView):
model = Lesson
template_name = 'courses/lesson-details.html'
url模式包括以下内容:
path('', CourseListView.as_view(), name = 'course-list'),
path('course/<int:pk>/', CourseDetailView.as_view(), name = 'course-detail'),
path('lesson/<int:pk>/', LessonDetailView.as_view(), name = 'lesson-detail'),
在 lesson-detail
的 html 模板中,包含以下面包屑导航:
<!-- ##### Breadcumb Area Start ##### -->
<div class="breadcumb-area">
<!-- Breadcumb -->
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{% url 'home' %}">Home</a></li>
<li class="breadcrumb-item"><a href="{% url 'course-list' %}">Courses</a></li>
<li class="breadcrumb-item"><a href="{{ course.get_absolute_url }}">{{course.title}}</a></li> {% comment%} This doesn't work {%endcomment%}
<li class="breadcrumb-item active" aria-current="page">{{ lesson.title }}</li>
<li></li>
</ol>
</nav>
</div>
我怎样才能让它发挥作用?课程标题是 "music",所需的输出看起来像 HOME / COURSES / MUSIC / FLUTE
。我希望能够在网站的多个位置包含课程的 url,包括 运行 文本。
非常感谢您的帮助!
LessonDetailView
没有任何超能力,它无法猜测您想在模板上下文中拥有一个 Course
实例,也无法猜测您想要哪个实例。结果,模板无法解析名称 course
并确实吐出一个空字符串。
好消息是 - 假设您的 Lesson
模型(您忘记了 post)在 Course
上有一个外键,即:
class Lesson(models.Model):
course = models.ForeignKey(Course, ....)
# etc
然后就可以从lesson
实例中得到相关的课程实例,即:
<li class="breadcrumb-item">
{% with course=lesson.course %}
<a href="{{ course.get_absolute_url }}">{{course.title}}</a></li>
{% endwith %}
</li>
编辑:
May be because the model has many to many relations and it requires a different solution
嗯,确实如此。在进入任何实施细节之前,问问自己,如果只有课程 ID,您如何知道应该选择哪些相关课程?答:你不能。 IOW,您必须使课程 ID 成为课程视图 url 模式的一部分:
path('lesson/<int:course_id>/<int:pk>/', LessonDetailView.as_view(), name = 'lesson-detail'),
然后更新您的视图以获取课程 ID,从数据库中检索课程并 inject it in the context(注意:未经测试的代码因此可能无法开箱即用 - 但您有非常全面的文档帮助你):
class LessonDetailView(DetailView):
model = Lesson
template_name = 'courses/lesson-details.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
course = self.object.courses.get(pk=kwargs["course_id"])
context["course"] = course
return context
当然,将您的模板重置为初始版本。
编辑 2:
我忘了这会中断 Lesson.get_absolute_url()
,因为你依赖于了解当前课程,这在这种情况下是不可能的。解决方案非常简单,就是从 Lesson
模型中删除此方法(实际上,模型不应该知道任何关于 url 的信息)并通过调用 lesson.get_absolute_url()
替换所有对 lesson.get_absolute_url()
的调用=23=](在 python 代码中)或者它是 {% url %}
模板标签的兄弟(在模板中)。
在我post这个问题之前,我尝试了几个解决方案,但没有vien,可能是因为我对django和web开发经验不多。 我想在面包屑导航菜单中显示课程名称。但是,它显示空白。使用Django 2.1.4,模型如下:
class Course(model.Model):
title = models.CharField(max_length=128)
description = RichTextUploadingField(default='No description available.')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('course-detail', kwargs={'pk': self.pk})
编辑:添加课程模型
课程模型与课程具有多对多关系。具体如下:
class Lesson(models.Model):
title = models.CharField(max_length=512)
content = RichTextUploadingField()
course = models.ManyToManyField(Course)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('lesson-detail', kwargs={'pk': self.pk})
views.py包含以下观点
class CourseListView(ListView):
model = Course
template_name = 'courses/courses.html'
context_object_name = 'courses'
paginate_by = 10
class CourseDetailView(DetailView):
model = Course
template_name = 'courses/course-detail.html'
class LessonDetailView(DetailView):
model = Lesson
template_name = 'courses/lesson-details.html'
url模式包括以下内容:
path('', CourseListView.as_view(), name = 'course-list'),
path('course/<int:pk>/', CourseDetailView.as_view(), name = 'course-detail'),
path('lesson/<int:pk>/', LessonDetailView.as_view(), name = 'lesson-detail'),
在 lesson-detail
的 html 模板中,包含以下面包屑导航:
<!-- ##### Breadcumb Area Start ##### -->
<div class="breadcumb-area">
<!-- Breadcumb -->
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{% url 'home' %}">Home</a></li>
<li class="breadcrumb-item"><a href="{% url 'course-list' %}">Courses</a></li>
<li class="breadcrumb-item"><a href="{{ course.get_absolute_url }}">{{course.title}}</a></li> {% comment%} This doesn't work {%endcomment%}
<li class="breadcrumb-item active" aria-current="page">{{ lesson.title }}</li>
<li></li>
</ol>
</nav>
</div>
我怎样才能让它发挥作用?课程标题是 "music",所需的输出看起来像 HOME / COURSES / MUSIC / FLUTE
。我希望能够在网站的多个位置包含课程的 url,包括 运行 文本。
非常感谢您的帮助!
LessonDetailView
没有任何超能力,它无法猜测您想在模板上下文中拥有一个 Course
实例,也无法猜测您想要哪个实例。结果,模板无法解析名称 course
并确实吐出一个空字符串。
好消息是 - 假设您的 Lesson
模型(您忘记了 post)在 Course
上有一个外键,即:
class Lesson(models.Model):
course = models.ForeignKey(Course, ....)
# etc
然后就可以从lesson
实例中得到相关的课程实例,即:
<li class="breadcrumb-item">
{% with course=lesson.course %}
<a href="{{ course.get_absolute_url }}">{{course.title}}</a></li>
{% endwith %}
</li>
编辑:
May be because the model has many to many relations and it requires a different solution
嗯,确实如此。在进入任何实施细节之前,问问自己,如果只有课程 ID,您如何知道应该选择哪些相关课程?答:你不能。 IOW,您必须使课程 ID 成为课程视图 url 模式的一部分:
path('lesson/<int:course_id>/<int:pk>/', LessonDetailView.as_view(), name = 'lesson-detail'),
然后更新您的视图以获取课程 ID,从数据库中检索课程并 inject it in the context(注意:未经测试的代码因此可能无法开箱即用 - 但您有非常全面的文档帮助你):
class LessonDetailView(DetailView):
model = Lesson
template_name = 'courses/lesson-details.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
course = self.object.courses.get(pk=kwargs["course_id"])
context["course"] = course
return context
当然,将您的模板重置为初始版本。
编辑 2:
我忘了这会中断 Lesson.get_absolute_url()
,因为你依赖于了解当前课程,这在这种情况下是不可能的。解决方案非常简单,就是从 Lesson
模型中删除此方法(实际上,模型不应该知道任何关于 url 的信息)并通过调用 lesson.get_absolute_url()
替换所有对 lesson.get_absolute_url()
的调用=23=](在 python 代码中)或者它是 {% url %}
模板标签的兄弟(在模板中)。