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

时间:2015-08-02 12:19:31

标签: wagtail

为了区分Wagtail CMS管理员中的页面(在页面列表视图中,而不是在编辑页面视图中),title是 - 在我的情况下 - 还不够。我有一个页面类型很长的页面列表(例如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

但是这不起作用,没有page.title的{​​{1}}用于相应的Wagtail-admin-template

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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 %}生成循环中的网页列表,并通过include({{ 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”可调用的fork或类似的东西。

答案 2 :(得分:0)

wagtailmodeladmin似乎正是我搜索过的内容:扩展wagtailadmin以在页面模型的基础上显示一组已定义的字段 - 不仅仅是title;就像我会在Django管理站点中拥有它一样。

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

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