按标记筛选显示所有页面,而不是标记页面

  • 本文关键字:筛选 显示 tags wagtail
  • 更新时间 :
  • 英文 :


参考标记上的Wagtial配方,我在课程应用程序中设置了标记。但是,标记过滤似乎不起作用。标签本身似乎正在工作:我可以在管理员中选择标签并在页面上显示它们。我有一个课程页面标签模型,似乎工作正常:

class CoursePageTag(TaggedItemBase):
content_object = ParentalKey('CoursePage', 
on_delete=models.CASCADE, 
related_name='course_tagged_items')

我在CourseListingPage模型(使用template = "courses/course_listing_page.html"(中的过滤设置如下:

#  Get all courses
course_pages = (
CoursePage.objects.live().public().order_by("-first_published_at")
)
# Filter by tag
tag = request.GET.get('tag')
if tag:
course_pages = course_pages.filter(tags__name=tag)
context['course_pages'] = course_pages
return context

在模板中,我有这样的:

{% for tag in page.tags.all %}
<a href="{% pageurl page.get_parent %}?tag={{ tag }}">{{ tag }}</a>
{% endfor %}

当我点击带有上述模板代码的课程页面上的标签时,我确实会到达父课程列表页面,URL显示了似乎正确的过滤格式:

courses/course-listing/?tag=test

但我没有看到经过过滤的页面列表。相反,我看到所有课程页面。我怀疑我在这里做错了一件很简单的事。

回答我自己的问题:{%for course_pages%}是模板中筛选页面列表位置的必需项,在我的情况下,位于筛选代码下方。所以,我现在有了过滤代码,然后是页面的实际列表,它以开头

{% for course in course_pages %}
{% with course=course.specific %}
... HTML/template code for page details (e.g. course.title, course.sub_title) ...

{% endfor %}
{% endwith %}

我一开始并没有意识到过滤代码只做过滤;它实际上并没有显示过滤的结果。对于像我这样的初学者来说,当文档说代码将在将列表传递给模板进行渲染之前,只过滤那些具有匹配标记名的页面时,可能会误解这一点,认为模板将在没有进一步步骤的情况下显示过滤后的结果。但事实并非如此。额外的上下文代码是必需的——至少对我来说是这样

最新更新