45 votes

Comment créer un CharField non vide dans Django ?

J'ai un modèle simple qui ressemble à ceci :

class Group(models.Model):
    name = models.CharField(max_length = 100, blank=False)

Je m'attendrais à ce que cela entraîne une erreur d'intégrité, mais ce n'est pas le cas :

group = Group() # name is an empty string here
group.save()

Comment puis-je m'assurer que la variable name est définie sur quelque chose de non vide ? Par exemple, pour que la base de données rejette toute tentative d'enregistrement d'une chaîne vide ?

30voto

rptmat57 Points 1427

Une autre option qui ne vous oblige pas à appeler manuellement clean est d'utiliser ceci :

name = models.CharField(max_length=100, blank=False, default=None)
  • blank empêchera qu'une chaîne vide soit fournie dans l'administration ou en utilisant un formulaire ou un sérialiseur (la plupart des cas). Cependant, comme indiqué dans les commentaires, cela n'empêche malheureusement pas des choses comme model.name = "" (réglage manuel de la chaîne vide)
  • default=None mettra le nom à None si vous utilisez quelque chose comme group = Group() ce qui soulève une exception lors de l'appel save

21voto

balazs Points 2041

De la Documentation sur Django dans ce cas, votre name sera stocké sous la forme d'une chaîne vide, parce que l'élément null est False par défaut. Si vous souhaitez définir une valeur par défaut personnalisée, utilisez le champ default option de champ.

name = models.CharField(max_length=100, blank=False, default='somevalue')

Sur cette page, vous pouvez voir que le blank n'est pas lié à la base de données.

Mise à jour :

Vous devez surcharger la fonction clean de votre modèle, pour avoir une validation personnalisée, ainsi votre modèle def sera :

class Group(models.Model):
  name = models.CharField(max_length=100, blank=False)
  def clean(self):
    from django.core.exceptions import ValidationError
    if self.name == '':
        raise ValidationError('Empty error message')

Ou vous pouvez remplacer ValidationError à quelque chose d'autre. Alors avant d'appeler group.save() appelez group.full_clean() qui appellera clean()

D'autres éléments liés à la validation sont aquí .

12voto

Ricardo Points 108

Ou vous pouvez simplement utiliser MinLengthValidator avec un minimum de 1 caractère :

from django.core.validators import MinLengthValidator

class Company(BaseModel):
    """Company"""

    name = models.CharField(max_length=255,
                            validators=[MinLengthValidator(1)])

9voto

Lotram Points 80

J'ai passé beaucoup de temps à chercher la meilleure solution à ce problème simple (et ancien). Et depuis Django 2.2, il existe en fait une réponse très simple, que je vais donc écrire ici au cas où quelqu'un rencontrerait encore le même problème :

Depuis Django 2.2, nous pouvons définir CheckConstraints Il est donc facile de définir une contrainte de chaîne non vide :

from django.db import models

class Article(models.Model):
   title = models.CharField(max_length=32)

    class Meta:
        constraints = [
            models.CheckConstraint(check=~models.Q(title=""), name="non_empty_title")
        ]

1voto

Vamsi Points 4018

Le système de validation de Django suppose que tous les champs sont obligatoires, à moins que vous n'indiquiez qu'il est possible de les laisser vides.

Avez-vous enregistré la classe dans l'administration ? Des erreurs apparaissent-elles lorsque vous laissez le champ vide ?

Django krishna

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