按标签过滤显示所有页面而不是标记页面
Filtering by tag shows all pages instead of tagged pages
参考标签上的 Wagtial recipe,我在我的课程应用程序中设置了标签。但是,标签过滤似乎不起作用。标签本身似乎在工作:我可以在管理员中 select 标签并在页面上显示它们。我有一个似乎工作正常的课程页面标签模型:
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
但我没有看到过滤后的页面列表。相反,我看到了 all 课程页面。我怀疑我在这里做错了一些非常简单的事情。
回答我自己的问题:{% for course in 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 %}
我最初并没有意识到过滤代码只是进行过滤;它实际上并没有显示过滤的结果。对于像我这样的初学者,当文档说代码将 将列表过滤为仅具有匹配标签名称的页面,然后再将其传递给渲染模板 ,可能会误读它这意味着模板将显示过滤后的结果而无需进一步的步骤。但事实并非如此。额外的上下文代码是必需的——至少对我来说是这样。
参考标签上的 Wagtial recipe,我在我的课程应用程序中设置了标签。但是,标签过滤似乎不起作用。标签本身似乎在工作:我可以在管理员中 select 标签并在页面上显示它们。我有一个似乎工作正常的课程页面标签模型:
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
但我没有看到过滤后的页面列表。相反,我看到了 all 课程页面。我怀疑我在这里做错了一些非常简单的事情。
回答我自己的问题:{% for course in 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 %}
我最初并没有意识到过滤代码只是进行过滤;它实际上并没有显示过滤的结果。对于像我这样的初学者,当文档说代码将 将列表过滤为仅具有匹配标签名称的页面,然后再将其传递给渲染模板 ,可能会误读它这意味着模板将显示过滤后的结果而无需进一步的步骤。但事实并非如此。额外的上下文代码是必需的——至少对我来说是这样。