Wagtail:调用 rooutablepageurl 抛出 AttributeError 的模板标记

Wagtail: Template tag with call to routablepageurl throwing AttributeError

我正在尝试在 Wagtail 中构建一个简单的博客,并试图弄清楚其中的所有内容是如何组合在一起的,以及为什么这些东西不起作用,这让我感到困惑。当我尝试加载 'About' 页面时,我一直收到 AttributeError: 'str' object has no attribute 'relative_url',我认为这与 navbar.html 有关,我正在使用包含标记将其引入 base.html。我无法理解错误,任何人都可以帮助分解它吗?

Navbar.html

{% load static wagtailcore_tags blogapp_tags wagtailroutablepage_tags %}

<div class="container" id="nav-container">
  <nav class="navbar navbar-expand-sm py-0 px-0" id="main-nav">
  <button class="navbar-toggler" data-toggle="collapse" data-target="#navbarCollapse">
    <span class="navbar-toggler-icon"></span>
  </button>
  <form role="search" method="get" class="form-inline pt-3 form-search" action="{% routablepageurl home_page 'post_search' %}">
    <input type="text" name="q" id="search-bar" class="form-control mr-sm-2 search-query" type="search" placeholder="Search&hellip;" title="Search for:" aria-label="Search">
    <button class="btn btn-outline-danger my-2 my-sm-0" name="submit" id="search-button" type="submit" value="Search">Search</button>
  </form>
  <div class="collapse navbar-collapse" id="navbarCollapse">
    <ul class="navbar-nav mt-2 ml-auto">
      <li class="nav-item">
        <a href="/about" class="nav-link">About</a>
      </li>
      <li class="nav-item">
        <a href="#" class="nav-link">Archive</a>
      </li>
    </ul>
  </div>
  </nav> 
</div>

Models.py

class HomePage(RoutablePageMixin, Page):
    description = models.CharField(max_length=255, blank=True, null=True)

    content_panels = Page.content_panels + [
        FieldPanel('description', classname='full')
    ]

    def get_context(self, request, *args, **kwargs):
        context = super(HomePage, self).get_context(request, *args, **kwargs)
        context['posts'] = self.posts
        context['home_page'] = self
        context['search_type'] = getattr(self, 'search_type', '')
        context['search_term'] = getattr(self, 'search_term', '')
        return context


    def get_posts(self):
        return BlogPage.objects.descendant_of(self).live()

...

    @route(r'^search/$')
    def post_search(self, request, *args, **kwargs):
        search_query = request.GET.get('q', None)
        self.posts = self.get_posts()
        if search_query:
            self.posts = self.posts.filter(body__icontains=search_query)
            self.search_term = search_query
            self.search_type = 'search'
        return Page.serve(self, request, *args, **kwargs)


class AboutPage(Page):
    body = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('body', classname='full')
    ]

about_page.html

{% extends "home/base.html" %}
{% load static wagtailcore_tags blogapp_tags wagtailroutablepage_tags %}

{% block content %}

<div class="container mt-4" id="nav-container">
  <h3 class="blog-text">About</h3>
  <br>
  <div class="row">
    <div class="col-md-8">
      <p class="pt-0 mb-5">{{ page.body }}</p>
    </div>
  </div>
</div>

{% endblock %}

完整项目在这里:

https://bitbucket.org/nicecore/adiscaday-wagtail/src/master/

这里有完整的回溯:

http://dpaste.com/1T65ZCV

@gasman 在我原来的 post 的评论中有用地建议 home_page 变量以某种方式被覆盖,所以我从我的 BlogPage 中复制了 get_context 方法AboutPage 中的模型(开始怀疑我是否不应该只为我的“关于”页面使用 BlogPage 的实例并将不需要的字段留空...)并且它似乎正在工作:

class AboutPage(Page):
    body = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('body', classname='full')
    ]

    def get_context(self, request, *args, **kwargs):
        context = super(AboutPage, self).get_context(request, *args, **kwargs)
        context['home_page'] = self.get_parent().specific
        context['about'] = self
        return context

任何关于 home_page 被覆盖的原因的见解,以便我以后可以避免这个问题,将不胜感激!

站点的根页面始终作为变量 request.site.root_page 提供,因此您可以将标记更改为:

{% routablepageurl request.site.root_page.specific 'post_search' %}