As vezes alguns campos requerem validações além do tipo de dados neles inserido. Abaixo tem um exemplo que fiz para um caso desse.
A necessidade era validar um charfield de acordo com uma série de valores e por ser campo aberto não poderia fazer um choices.
models.py
class SuaClasse(models.Model): ... seu_atributo = models.CharField(max_length=20) ...
admin.py
from django.core.exceptions import ValidationError import re class SuaClasseAdminForm(forms.ModelForm): class Meta: model = SuaClasse def clean_seu_atributo(self): cleaned_data = super(SuaClasseAdminForm, self).clean() seu_atributo = cleaned_data.get("seu_atributo") if not seu_atributo in ['TL','TR','BR','BL','C','R']: m = re.search('[0-9]*(%)*x[0-9]*(%)*', seu_atributo) if not m: raise ValidationError("Preencha o atributo com uma das opções disponíveis.") class SuaClasseAdmin(admin.ModelAdmin): form = SuaClasseAdminForm ...
No exemplo acima, preciso que o valor de seu_atributo seja um dos valores contidos na lista ['TL','TR','BR','BL','C','R'] ou respeite a expressão regular que testa para os seguintes exemplos: 300x200, 50%x300, 40x90% ou 150x400.
O que podemos notar é que o método clean_seu_atributo fará a validação no campo especificado e trará o erro logo acima do campo em caso de falha. Também é possivel fazer somente o método clean, contudo o erro será mostrado no início do form, sem vínculo a campo algum.
hasta!
Nenhum comentário:
Postar um comentário