194 votes

Comment limiter la valeur maximale d’un champ numérique dans un modèle de Django ?

Django a différents champs numériques disponibles pour une utilisation dans les modèles, par exemple DecimalField et PositiveIntegerField. Bien que l'ancien peut être limité au nombre de décimales stockées et le nombre total de caractères stockés, est-il possible de le restreindre à stocker uniquement les numéros dans une certaine gamme, par exemple 0.0-5.0 ?

À défaut, est-il possible de limiter un PositiveIntegerField à seulement magasin, par exemple, les nombres jusqu'à 50?

Mise à jour: maintenant que le Bug 6845 a été fermé, ce StackOverflow question peut être discutable. - sampablokuper

436voto

user1569050 Points 754

Vous pouvez utiliser les validateurs intégrés de Django-

Edit: bien que ces ne fonctionne que lorsque vous utilisez le modèle dans un ModelForm, pas si vous utilisez le modèle « en soi », soupire.

145voto

NathanD Points 2433

Vous pouvez également créer un modèle sur mesure type de champ - voir http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

Dans ce cas, il peut "hériter" de la intégré dans IntegerField et remplacer sa logique de validation.

Plus je pense à ce sujet, je me rends compte combien utile pour de nombreuses applications Django. Peut-être un IntegerRangeField type pourrait être présenté comme un patch pour le Django devs envisager d'ajouter du 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)

Puis dans votre classe de modèle, vous pouvez l'utiliser comme ceci (champ étant le module où vous placez le code ci-dessus):

size = fields.IntegerRangeField(min_value=1, max_value=50)

OU pour une gamme de négatifs et positifs (comme un oscillateur de gamme):

size = fields.IntegerRangeField(min_value=-100, max_value=100)

Ce qui serait vraiment cool, c'est que si il peut être appelé avec l'opérateur d'intervalle comme ceci:

size = fields.IntegerRangeField(range(1, 50))

Mais cela demanderait beaucoup plus de code depuis puisque vous pouvez spécifier un "skip" paramètre de gamme(1, 50, 2) - idée Intéressante mais...

101voto

congocongo Points 231
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

size = models.IntegerField(validators=[MinValueValidator(0),
                                       MaxValueValidator(5)])

57voto

chrishaum Points 342

J’ai eu ce même problème ; Voilà ma solution :

10voto

tghw Points 14244

Il y a deux façons de le faire. Une consiste à utiliser la validation du formulaire de jamais laisser n’importe quel nombre plus de 50 être entré par un utilisateur. Documents de validation de formulaire.

Si aucun utilisateur n’est impliqué dans le processus, ou vous n’utilisez pas un formulaire pour entrer des données, puis vous devrez substituer du modèle `` méthode pour lever une exception ou limiter les données entrant dans le champ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X