【问题标题】:How to display the children of a wagtail page如何显示鹡鸰页面的孩子
【发布时间】:2020-01-26 15:13:14
【问题描述】:

我的要求听起来很简单,但我正在努力实现它

在我的 wagtail 项目中,我有一个 BlogListingPage,它有许多子页面。我正在尝试在网页中创建孩子的列表。这是我的代码:

models.py

class BlogListingPage(Page):    
    ...
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        context['blog_pages'] = BlogDetailPage.objects.live().child_of(self)
        return context


class BlogDetailPage(Page):
    ...    
    blog_listing = models.ForeignKey(BlogListingPage,
                                     on_delete=models.PROTECT,
                                     blank=True,
                                     null=True,)

views.py

def blog(request):
    url = 'blog/blog_listing_page.html'
    context = {'data': BlogListingPage.objects.all()}
    return render(request, url, context)

blog_listing_page.html

{% block content %}
    {% for blog_listing in data %}
        {% for post in blog_listing.blogdetailpage %}
            <a href="{% pageurl post %}">{{ post.blog_title }}</a>
        {% endfor %}
    {% endfor %}
{% endblock content %}

我迷失在 django/wagtail pages/objects/querysets/all()/specific 的迷雾中

有人可以带我去清澈的蓝色水吗?

【问题讨论】:

  • @Psionman:阿门,“我迷失在 django/wagtail pages/objects/querysets/all()/specific”的迷雾中(+“views/tags/templates”)。感谢您的问题,您收到的答案有助于使这里的雾变得不那么浓密。我将在对答案的评论中发布后续澄清请求。

标签: python django wagtail


【解决方案1】:

关于您的方法的一些建议:

  1. 拥有从BlogDetailPageBlogListingPage 的外键并不是Wagtail 组织父子关系的方式。所有Page 对象都已经有一个树层次结构,你应该依赖它,否则你会失去 Wagtail 提供的所有内置树处理。

    您应该使用parent/subpage rules 来指定页面类型如何相互关联。在你的情况下,它看起来像:

    class BlogListingPage(Page):    
        subpage_types = ['myapp.BlogDetailPage']
    
    class BlogDetailPage(Page):
        parent_page_types = ['myapp.BlogListingPage']
    
  2. BlogListingPage 上的 get_context() 方法仅在 Wagtail 在视图中提供该特定页面时运行。当您在 blog 视图中迭代这些页面时,它不会运行。为了访问那里的孩子,您需要执行以下操作:

    {% for blog_listing in data %}
        {% for post in blog_listing.get_children.live %}
            <a href="{% pageurl post %}">{{ post.blog_title }}</a>
        {% endfor %}
    {% endfor %}
    

    即,您需要在页面上使用get_children() 方法来获取它的子级。 live() 进一步过滤此以排除未发布的页面。请注意,这仅在博客文章是列表页面的子项(在 Wagtail 页面树意义上)时才有效。如果您只使用帖子 URL 和标题,specific() 在这里并不重要 - 如果您想显示属于您的模型而不是基本 Page 模型的字段,则它是相关的。

【讨论】:

  • 谢谢。一个救生员。解决方案的精彩描述
  • 在调用get_children() 或其等效项的位置是否有任何性能考虑?答案显示通过模板中的标记进行迭代,但您可以改写 Page 模型中的上下文 per the Wagtail docs 'context['blog_entries'] = BlogPage.objects.child_of(self)
    return context'
    然后遍历模板中的“blog_entries”。哪种方法更快/更好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多