我有一个主要的 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 »</a>
</div>
</div>
{% endfor %}
但是没有任何显示,也没有给出任何错误。
如何在 Wagtail 之外的应用程序中获取和显示已发布的 Wagtail 帖子列表?
如果您的主页由标准的 Django 视图和 URL 路由处理,那么定义一个
HomePage
模型本身不会改变它——要沿着这条路走下去,您还需要:
/blog/
路径(即删除主页视图的现有路由并将 path("blog/", include(wagtail_urls))
更改为 path("", include(wagtail_urls))
)但是,如果您只想将一些 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 %}
.
我不是 Wagtail 方面的专家,但您是否在模板中导入了 wagtail 标签?
要获取要在 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 添加额外的过滤器以获得更具体的结果,例如仅检索特定类别或特定作者的帖子。