Vous pouvez également créer un type de champ de modèle personnalisé - voir http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
Dans ce cas, vous pouvez «hériter» du champ IntegerField intégré et remplacer sa logique de validation.
Plus j'y pense, plus je réalise à quel point cela serait utile pour de nombreuses applications Django. Peut-être qu'un type IntegerRangeField pourrait être soumis en tant que patch pour que les développeurs Django envisagent l'ajout au tronc.
Cela fonctionne pour moi:
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)
Ensuite, dans votre classe de modèle, vous l'utiliseriez comme ceci (le champ étant le module où vous mettez le code ci-dessus):
size = fields.IntegerRangeField(min_value=1, max_value=50)
OU pour une plage de négatif et de positif (comme une plage d'oscillateur):
size = fields.IntegerRangeField(min_value=-100, max_value=100)
Ce qui serait vraiment cool, c'est s'il pouvait être appelé avec l'opérateur de plage comme ceci:
size = fields.IntegerRangeField(range(1, 50))
Mais cela nécessiterait beaucoup plus de code car puisque vous pouvez spécifier un paramètre `` skip '' - range (1, 50, 2) - Idée intéressante cependant ...