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