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…" 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/
这里有完整的回溯:
@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' %}
我正在尝试在 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…" 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/
这里有完整的回溯:
@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' %}