Você também pode criar um tipo de campo de modelo personalizado - consulte http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
Nesse caso, você pode 'herdar' do IntegerField interno e substituir sua lógica de validação.
Quanto mais penso nisso, percebo o quanto isso seria útil para muitos aplicativos Django. Talvez um tipo IntegerRangeField possa ser enviado como um patch para os desenvolvedores do Django considerarem adicionar ao tronco.
Isso está funcionando para mim:
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)
Em seguida, na sua classe de modelo, você a usaria assim (o campo é o módulo onde você coloca o código acima):
size = fields.IntegerRangeField(min_value=1, max_value=50)
OU para uma faixa de negativo e positivo (como uma faixa do oscilador):
size = fields.IntegerRangeField(min_value=-100, max_value=100)
O que seria muito legal é se ele pudesse ser chamado com o operador de intervalo assim:
size = fields.IntegerRangeField(range(1, 50))
Mas, isso exigiria muito mais código, já que você pode especificar um parâmetro 'skip' - range (1, 50, 2) - embora seja interessante ...