如何限制Wagtail中register setting单例模型的最大实例数?
关于限制Wagtail Glossary设置模型实例数量的实现
可以限制实例最大数量,分两种场景提供实现方式:
1. 简便实现:全局单例(仅允许1个实例)
如果需求是整个系统只能存在一个Glossary实例,无需重写save方法,只需在注册设置时将site_aware参数设为False:
from wagtail.contrib.settings.models import BaseGenericSetting, register_setting @register_setting(site_aware=False) class Glossary(BaseGenericSetting): # 你的字段定义 ...
Wagtail会自动处理后台逻辑,用户无法创建第二个实例,只能编辑已有的那个全局实例。
2. 灵活数量限制(重写save方法)
如果需要限制每个站点最多N个实例,或者全局最多N个实例(N>1),就需要重写模型的save方法,通过验证拦截超出限制的创建操作:
示例1:限制每个站点最多2个实例
from django.core.exceptions import ValidationError from wagtail.contrib.settings.models import BaseGenericSetting, register_setting @register_setting class Glossary(BaseGenericSetting): # 字段定义 ... def save(self, *args, **kwargs): max_instances = 2 # 统计当前站点已有的实例数 existing_count = Glossary.objects.filter(site=self.site).count() # 仅在新建实例时检查(self.pk为空表示新建) if self.pk is None and existing_count >= max_instances: raise ValidationError(f"每个站点最多只能创建{max_instances}个Glossary实例") super().save(*args, **kwargs)
示例2:全局最多3个实例(不区分站点)
from django.core.exceptions import ValidationError from wagtail.contrib.settings.models import BaseGenericSetting, register_setting @register_setting class Glossary(BaseGenericSetting): # 字段定义 ... def save(self, *args, **kwargs): max_instances = 3 existing_count = Glossary.objects.count() if self.pk is None and existing_count >= max_instances: raise ValidationError(f"全局最多只能创建{max_instances}个Glossary实例") super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Headmaster
相关产品推荐
相关产品推荐

