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 modifier 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 comme patch pour que les développeurs de Django envisagent de l'ajouter 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'utiliserez comme suit (le champ étant le module dans lequel vous avez placé le code ci-dessus) :
size = fields.IntegerRangeField(min_value=1, max_value=50)
OU pour une gamme de négatif et de positif (comme une gamme d'oscillateur) :
size = fields.IntegerRangeField(min_value=-100, max_value=100)
Ce qui serait vraiment cool, c'est qu'on puisse l'appeler avec l'opérateur de plage, comme ceci :
size = fields.IntegerRangeField(range(1, 50))
Mais, cela nécessiterait beaucoup plus de code puisque vous pouvez spécifier un paramètre 'skip' - range(1, 50, 2) - Idée intéressante cependant...
0 votes
Vous pourriez créer un signal de pré-enregistrement : http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save
0 votes
J'aurais dû mentionner que je souhaite également que la restriction soit appliquée dans l'administration de Django. Pour obtenir cela, au moins, la documentation a ceci à dire : docs.djangoproject.com/fr/dev/ref/contrib/admin/
0 votes
En fait, avant la version 1.0 de Django, il semblait y avoir une solution très élégante : cotellese.net/2007/12/11/… . Je me demande s'il n'y a pas un moyen aussi élégant de faire cela dans la version svn de Django.
0 votes
Je suis déçu d'apprendre qu'il y a n'a pas Il semble qu'il y ait un moyen élégant de le faire avec le svn actuel de Django. Voir ce fil de discussion pour plus de détails : groups.google.com/group/django-users/browse_thread/thread/
0 votes
Utilisez les validateurs sur le modèle, et la validation fonctionnera dans l'interface d'administration et dans les ModelForms : docs.djangoproject.com/fr/dev/ref/validateurs/