如何将面板分配给
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
的优雅划分。
我什至查看了
Wagtail
的源代码,但它使用了forms.ModelForm
类和几个辅助类。有没有更简单的方法来为 BaseSiteSetting
类创建选项卡?
profile_tab = SettingsTab("profile", gettext_lazy("Profile"), order=100)
notifications_tab = SettingsTab(
"notifications", gettext_lazy("Notifications"), order=200
)
通过扩展 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,
]