Sie können auch einen benutzerdefinierten Modellfeldtyp erstellen - siehe http://docs.djangoproject.com/de/dev/howto/custom-model-fields/#howto-custom-model-fields
In diesem Fall können Sie vom integrierten IntegerField 'erben' und dessen Validierungslogik überschreiben.
Je mehr ich darüber nachdenke, desto nützlicher wird mir, dass dies für viele Django-Apps nützlich ist. Möglicherweise könnte ein IntegerRangeField-Typ als Patch für die Django-Entwickler eingereicht werden, um das Hinzufügen zum Trunk in Betracht zu ziehen.
Das funktioniert bei mir:
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)
Dann würden Sie es in Ihrer Modellklasse folgendermaßen verwenden (Feld ist das Modul, in das Sie den obigen Code einfügen):
size = fields.IntegerRangeField(min_value=1, max_value=50)
ODER für einen Bereich von negativ und positiv (wie ein Oszillatorbereich):
size = fields.IntegerRangeField(min_value=-100, max_value=100)
Was wirklich cool wäre, wäre, wenn es mit dem Bereichsoperator wie folgt aufgerufen werden könnte:
size = fields.IntegerRangeField(range(1, 50))
Dies würde jedoch viel mehr Code erfordern, da Sie einen 'Überspringen'-Parameter angeben können - Bereich (1, 50, 2) - Interessante Idee ...