获取 Wagtail 帖子列表以显示在 Wagtail 之外的 Django 模板中

问题描述 投票:0回答:3

我有一个主要的 Django 网站,它包括一个位于

/
的主页,使用标准的 django 模板,然后是一个位于
/blog

的 wagtail 博客

在我的主页上,我希望有人能够显示 wagtail 博客最近发表的文章。

我在做这件事时遇到了很多麻烦,因为我找不到任何资源或指南。

至此我为我的主页添加了一个模型(之前没有),只是为了获取博客:

from myblog.models import BlogPage


class HomePage(Page):
    def blogs(self):
        blogs = BlogPage.objects.all()
        blogs = blogs.order_by('-date')
        return blogs

然后我的主页模板有:

{% for blog in page.blogs %}
<div class="col-md-4">
    <a class="blog-post-link" href="{% pageurl blog %}">
      <h3>{{ blog.title }}</h3>
    </a>
    <div class="blog-intro">
      {{ blog.body|richtext|truncatewords_html:50 }}
      <a class="read-more" href="{% pageurl blog %}">Read More &raquo;</a>
    </div>
</div>
{% endfor %}

但是没有任何显示,也没有给出任何错误。

如何在 Wagtail 之外的应用程序中获取和显示已发布的 Wagtail 帖子列表?

django wagtail
3个回答
1
投票

如果您的主页由标准的 Django 视图和 URL 路由处理,那么定义一个

HomePage
模型本身不会改变它——要沿着这条路走下去,您还需要:

  • 更新您的 URL 路由,以便根路径由 Wagtail 处理,而不仅仅是
    /blog/
    路径(即删除主页视图的现有路由并将
    path("blog/", include(wagtail_urls))
    更改为
    path("", include(wagtail_urls))
  • 在 Wagtail 管理中创建一个主页实例
  • 在“设置”->“站点”下调整站点设置,使默认站点指向该主页作为其根页面,而不是您的博客索引页面

但是,如果您只想将一些 Wagtail 派生数据添加到现有的主页设置中,则这些都不是必需的 - 您只需将

BlogPage
查询添加到视图函数传递给模板的数据中即可。假设视图函数当前看起来像:

def home(request):
    # ... do some processing here ...
    return render(request, "home/homepage.html", {
        'foo': 'bar',
    })

这会变成:

def home(request):
    # ... do some processing here ...

    blogs = BlogPage.objects.all()
    blogs = blogs.order_by('-date')

    return render(request, "home/homepage.html", {
        'foo': 'bar',
        'blogs': blogs,
    })

然后您可以在模板中访问变量

blogs
- 例如
{% for blog in blogs %}
.


0
投票

我不是 Wagtail 方面的专家,但您是否在模板中导入了 wagtail 标签?


0
投票

要获取要在 Wagtail 之外的 Django 模板中显示的 Wagtail 帖子列表,您可以使用

wagtail.wagtailcore.models.Page.objects.live()

方法。这将返回一个实时页面的 QuerySet,您可以使用它来检索您需要的帖子。例如,要从博客页面获取博客文章列表:

from wagtail.wagtailcore.models import Page

blog_page = Page.objects.get(slug='blog')
blog_posts = Page.objects.live().descendant_of(blog_page)

然后您可以使用 QuerySet 访问各个帖子及其属性。例如,要获取每个帖子的标题:

for post in blog_posts:
    print(post.title)

您还可以向 QuerySet 添加额外的过滤器以获得更具体的结果,例如仅检索特定类别或特定作者的帖子。

© www.soinside.com 2019 - 2024. All rights reserved.