1

为了区分 Wagtail CMS 管理员中的页面(在页面列表视图中,而不是在编辑页面视图中),title就我而言,这还不够。我有一长串一种页面类型(比如class BlogPage)的页面,其中一些页面可能具有相同的title. 因此,我想在此标题中添加第二个标识字段(此处为: date_from, a )。DateField

我想到了

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

但这不起作用,page.title没有 mydef用于相应的Wagtail-admin-template

简短版:如何在 Wagtail-admin 中将现有字段预先/附加到标题?

4

3 回答 3

1

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

def get_admin_display_title(self):
    return '{} - {}'.format(self.date_from, super().get_admin_display_title())
于 2017-04-25T14:49:08.813 回答
0

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

来自 wagtailadmin/pages/list.html 的实际管理模板在循环中生成页面列表,并在整个过程中广泛使用并通过 include ( ){% for page in pages %}调用。因此,基于检查代码,Wagtail 本身不支持此功能。检查其他包括。{{ page.title}}templates/wagtailadmin/pages/listing/_page_title_explore.htmltemplates/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

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

{{ page|uniquify_title }}

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

于 2015-08-02T21:19:27.467 回答
0

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

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

感谢另一个答案,我偶然发现了这种可能性。

于 2015-08-05T22:32:05.173 回答