如何在 Wagtail 管理面板的 BaseSiteSetting 中将面板分配给选项卡?

问题描述 投票:0回答:1

如何将面板分配给

BaseSiteSetting
中的特定选项卡?在
Page
类中,这很简单,因为我可以简单地使用这段代码来创建一个新面板:

author_panels = [
    MultiFieldPanel(
        [
            FieldPanel("Name"),
        ],
        heading=_("Author(s)"),
    ),
]

@cached_classmethod
def get_edit_handler(self):
    panels = self.get_panels().copy()
    panels += [
        ObjectList(self.author_panels, heading=_("Author(s)")),
    ]

    edit_handler = TabbedInterface(panels)
    return edit_handler.bind_to_model(self)

然而,在

BaseSiteSetting
中,就没那么简单了。
Wagtail
的管理面板中唯一实现此功能的地方是
Account
子页面。我真的很喜欢
Profile
Notifications
的优雅划分。

Account Settings in Wagtail

我什至查看了

Wagtail
的源代码,但它使用了
forms.ModelForm
类和几个辅助类。有没有更简单的方法来为
BaseSiteSetting
类创建选项卡?

profile_tab = SettingsTab("profile", gettext_lazy("Profile"), order=100)
notifications_tab = SettingsTab(
    "notifications", gettext_lazy("Notifications"), order=200
)
wagtail
1个回答
0
投票

通过扩展 BaseSettingPanel 类创建自定义设置面板。例如,假设您想为社交媒体链接创建一个面板:

from wagtail.contrib.settings.models import BaseSetting, register_setting
from wagtail.admin.edit_handlers import FieldPanel, MultiFieldPanel

@register_setting
class SocialMediaSettings(BaseSetting):
    facebook = models.URLField(blank=True)
    twitter = models.URLField(blank=True)
    instagram = models.URLField(blank=True)

    panels = [
        MultiFieldPanel([
            FieldPanel('facebook'),
            FieldPanel('twitter'),
            FieldPanel('instagram'),
        ], heading='Social Media Links')
    ]

在wagtail_hooks.py文件中注册自定义设置面板:

from wagtail.contrib.modeladmin.options import (
    ModelAdmin, modeladmin_register, ModelAdminGroup)
from wagtail.contrib.settings import hooks as settings_hooks
from .models import SocialMediaSettings

@modeladmin_register
class SocialMediaSettingsAdmin(ModelAdmin):
    model = SocialMediaSettings
    menu_icon = 'fa-cog'
    menu_order = 200
    add_to_settings_menu = True
    exclude_from_explorer = True

class SettingsHooks:
    def construct_settings_panel(self, parent, request):
        return parent.add_child_instance(SocialMediaSettings())

settings_hooks.register(SettingsHooks)

在 BaseSiteSetting 模型中,通过覆盖面板属性来包含自定义设置面板:

class BaseSiteSettings(ClusterableModel, models.Model):
    site_name = models.CharField(max_length=255, help_text=_("The name of your site"))
    ...

    panels = [
        ...
        SocialMediaSettings.panels,
    ]
© www.soinside.com 2019 - 2024. All rights reserved.