首页 > 解决方案 > Wagatail 2.1 (Django) 来自 Snippet 的自定义设置访问

问题描述

所以我有一些设置需要从界面进行配置。

@register_setting
class TierPricingSettings(BaseSetting):
    Monday = models.CharField(max_length=255)
    Tuesday = models.CharField(max_length=255)
    Wednesday = models.CharField(max_length=255)
    Thursday = models.CharField(max_length=255)
    Friday = models.CharField(max_length=255)
    Saturday = models.CharField(max_length=255)
    Sunday = models.CharField(max_length=255)


content_panels_english = [
    FieldPanel('Monday'),
    FieldPanel('Tuesday'),
    FieldPanel('Wednesday'),
    FieldPanel('Thursday'),
    FieldPanel('Friday'),
    FieldPanel('Saturday'),
    FieldPanel('Sunday'),
]

但是我似乎无法从片段中访问这些值?这是因为文档 说明您只能通过使用 python 访问它

 my_settings = TierPricingSettings.for_site(request.site)

但是,代码片段无权访问请求对象。我如何实现从管理面板配置设置并在片段中访问这些值。

标签: pythondjangodjango-modelswagtail

解决方案


wagtail.contrib.settings 模块的工作基础是 Wagtail 安装上的每个站点都有自己的一组设置。片段没有属于特定站点的内置概念(更一般地说,模型代码应该独立于当前请求工作),所以这里我们需要一些其他方法来识别要查找哪个站点的设置。

如果您仅在此 Wagtail 实例上运行单个站点并且不打算再添加任何内容,则可以使用以下命令告诉它从唯一站点中获取设置:

from wagtail.core.models import Site

my_settings = TierPricingSettings.for_site(Site.objects.first())

如果您有多个站点(或将来可能会这样做),但您希望全局TierPricingSettings对象应用到任何地方,最好的方法是在设置 -> 站点下将您的站点之一设置为“默认站点”,并确保您有填写TierPricingSettings管理员时选择的那个站点。然后查找相应的站点,如下所示:

from wagtail.core.models import Site

my_settings = TierPricingSettings.for_site(Site.objects.get(is_default_site=True))

如果您确实希望设置根据当前活动的站点而有所不同,您需要更新您的代码片段模型以具有属于站点的明确概念(例如添加外键Site),或者进行所有定价计算在接收站点对象作为参数的方法中。


推荐阅读