È inoltre possibile creare un tipo di campo del modello personalizzato: consultare http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
In questo caso, è possibile "ereditare" da IntegerField integrato e sovrascriverne la logica di convalida.
Più ci penso, mi rendo conto di quanto sarebbe utile per molte app Django. Forse un tipo IntegerRangeField potrebbe essere inviato come patch per gli sviluppatori di Django per prendere in considerazione l'aggiunta al trunk.
Questo funziona per me:
from django.db import models
class IntegerRangeField(models.IntegerField):
def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
self.min_value, self.max_value = min_value, max_value
models.IntegerField.__init__(self, verbose_name, name, **kwargs)
def formfield(self, **kwargs):
defaults = {'min_value': self.min_value, 'max_value':self.max_value}
defaults.update(kwargs)
return super(IntegerRangeField, self).formfield(**defaults)
Quindi nella tua classe di modello, lo useresti in questo modo (campo essendo il modulo in cui hai inserito il codice sopra):
size = fields.IntegerRangeField(min_value=1, max_value=50)
OPPURE per un intervallo di negativo e positivo (come un intervallo di oscillatori):
size = fields.IntegerRangeField(min_value=-100, max_value=100)
Ciò che sarebbe davvero bello sarebbe se potesse essere chiamato con l'operatore di gamma in questo modo:
size = fields.IntegerRangeField(range(1, 50))
Ma ciò richiederebbe molto più codice dato che è possibile specificare un parametro 'skip' - range (1, 50, 2) - Idea interessante però ...