class ArrayField(forms.Field):
def __init__(self, min_length=None, max_length=None, *args, **kwargs):
self.base_type = kwargs.pop('base_type', None)
self.min_length = min_length
self.max_length = max_length
super(ArrayField, self).__init__(*args, **kwargs)
def validate(self, value):
super().validate(value)
if self.min_length:
if not value or len(value) < self.min_length:
raise ValidationError("Need at least %s values " % self.min_length)
if self.max_length:
if value and len(value) > self.max_length:
raise ValidationError("Need at most %s values" % self.max_length)
def base_clean(self, value):
if self.base_type:
if isinstance(self.base_type, forms.FileField):
self.base_type.clean(value)
else:
raise ValidationError("Nested field type not error")
return value
def clean(self, value):
try:
if value in self.empty_values:
pass
else:
value = json.loads(value)
if not isinstance(value, list):
raise ValidationError("Must be array type")
except json.decoder.JSONDecodeError:
raise ValidationError("This field is not valid array type")
value = [self.base_clean(subValue) for subValue in value] if value else []
return super(ArrayField, self).clean(value)
``
Django 自定义field
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...