wagtail - 覆盖 Wagtail Page.get_url()?
问题描述
为了尝试仅将 WagtailPage
树用于导航结构,我声明了以下内容,以便可以根据需要呈现链接而不是页面 url:
class Node(Page):
class Meta:
verbose_name = 'Node (no content or link)'
link = models.CharField(max_length=255, default='', blank='True', help_text='Optional. Leave blank if serving as a parent page')
content_panels = Page.content_panels + [
FieldPanel('link')
]
def get_url(self, **kwargs):
if self.link != '':
return self.link
else:
return super().get_url(self, **kwargs)
在模板中,我已经尝试了这两种方法{{ item.url }}
,以及正在迭代的页面树中的项目在{{ item.specific.url }}
哪里。item
Wagtail 函数定义的项目 urlPage.get_url()
总是被渲染,def get_url()
我定义的永远不会被执行。
我知道 Wagtail Menus 但试图在这个项目中没有另一个依赖项,所以除了上述是否是最好的架构之外,我在让它工作时缺少什么?
为了在此处跟进,我已按照这些说明进行操作,并且在class Node(Page)
模型上我现在有以下内容代替def get_url
:
def get_url_parts(self, *args, **kwargs):
site_id, root_url, page_path = super().get_url_parts(*args, **kwargs)
# return an alternative page_path if link has a value
if self.link.strip() != '':
page_path = self.link
return site_id, root_url, page_path
我发现我仍然必须使用item.specific.get_url
. item.url
行不通。
解决方案
发生这种情况是因为url
Page 模型上的属性是由这行代码定义的:
url = property(get_url)
即定义一个属性,该属性url
包含对该get_url
函数的调用,因为它在该行代码运行时存在——即,Page.get_url 的默认实现。即使您覆盖get_url
Node 模型,Node 模型的url
属性仍将指向原始定义。
如果您url = property(get_url)
在定义之后添加该行get_url
,或者{{ item.specific.get_url }}
直接在您的模板上调用,您应该希望看到所需的行为。
根据文档,get_url_parts
如果您正在设置自定义 URL 方案,则建议使用覆盖方法,因为它包含所有 URL 访问器 ( url
, get_url
, full_url
, relative_url
) 共有的共享逻辑。
推荐阅读
- c# - Entity Framework 仅更新 50% 的事务
- angular - Ionic - 调用 2 个订阅函数并等待它们完成
- css - css 未应用于嵌套类
- html - 如何限制用户在单独的选项卡中访问 iframe?
- python - 构建单隐神经网络的错误
- mysql - Mysql 端口已经在使用中
- scala - 堆叠 monads Writer 和 OptionT
- javascript - Edge getattribute() 不起作用,返回 null
- assembly - Assembly OS - 如何在第 2 行写入文本?
- php - 如何在codeigniter中包含嵌套表单