将字段内容附加到 Wagtail-CMS-admin 中的标题字段

Append content of field to title field in Wagtail-CMS-admin

为了区分 Wagtail CMS 管理中的页面(在页面列表视图中,而不是在编辑页面视图中),title 在我的例子中是不够的。我有一长串页面 page-type(比如 class BlogPage),其中一些页面可能具有相同的 title。所以我想为这个标题添加第二个标识字段(此处:date_fromDateField)。

我想到了

class BlogPage(Page):
    ...
    def title(self):
    if self.date_from:
        return self.date_from + " - " + self.title
    else:
        return self.title

但这不行,没有我的defpage.title用于对应的Wagtail-admin-template.

简短版:如何将现有字段pre/-append添加到Wagtail-admin中的标题?

title 是一个实际的 Django 模型属性,不要试图覆盖它:https://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted

来自 wagtailadmin/pages/list.html 的实际管理模板使用 {% for page in pages %} 循环生成页面列表,并通过包含调用 {{ page.title}} (templates/wagtailadmin/pages/listing/_page_title_explore.html) 贯穿始终。因此,基于检查代码,Wagtail 本身不支持这一点。检查其他包括 templates/wagtailadmin/pages/listing/*

但是,Django 支持用您自己的模板覆盖一个应用程序的模板。您可以将此模板复制到项目的模板文件夹中,并保持相同的路径(例如,templates/wagtailadmin/pages/listing/_page_title_explore.html 假设您的项目是使用模板目录设置的)。

您必须将对 page.title 的调用替换为您自己的版本。过滤器或标签可能会使这更容易。将以下过滤器添加到您的模板标签中(例如 myapp/templatetetags/myapp_tags.py):

register = template.Library()

@register.filter
def uniquify_title(page):
    specific_page = page.specific
    try:
        return specific_page.date_from.strftime("%Y-%m-%d") + " - " + specific_page.title
    except AttributeError:
        return specific_page.title

然后将模板中从第 7 行和第 9 行开始的 {{ page.title}} 的用法替换为:

{{ page|uniquify_title }}

这样做的缺点是每次更新 Wagtail 时您都必须更新自己的 list.html 版本。您可以尝试在 Github 上提交问题并提出一个提供 "admin_title" 可调用或类似内容的分支。

wagtailmodeladmin 似乎完全符合我的搜索要求:扩展 wagtailadmin 以显示一组已定义的字段 - 不仅是 title - 在页面模型的基础上;就像我将它放在 Django 管理站点中一样。

这样我就不会更改默认的 wagtailadmin 页面列表 - 就像我在我的问题中尝试过的那样,但是 hook 在附加页面列表中作为额外的 wagtail-sidebar-navigation-entry。

感谢 other answer 我偶然发现了这种可能性。

如果您想替换所有模型管理员的标题(是的,这包括编辑页面),Wagtail 有一个内置的 mechanism

def get_admin_display_title(self):
    return '{} - {}'.format(self.date_from, super().get_admin_display_title())