J'ai ajouté un nouveau modèle à mon administrateur. Voici mes models.py:
class EngineeringToolAttributeType(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=255, blank=True, null=True)
api_url = models.CharField(max_length=255, blank=True, null=True)
api_field = models.CharField(max_length=50, blank=True, null=True)
active = models.BooleanField(default=True)
def __str__(self):
return self.name
Et le admin.py:
from extras.models import EngineeringToolAttributeType
from Django.contrib import admin
class EngineeringToolAttributeTypeAdmin(admin.ModelAdmin):
fields = ['name', 'description', 'api_url', 'api_field', 'active']
list_display = ('name', 'description', 'api_url', 'api_field', 'active')
admin.site.register(EngineeringToolAttributeType, EngineeringToolAttributeTypeAdmin)
Lorsque j'essaie d'ajouter (cliquez sur le bouton Ajouter via l'administrateur), j'obtiens cette erreur:
Internal Server Error: /website/admin/extras/engineeringtoolattributetype/add/
IntegrityError at /admin/extras/engineeringtoolattributetype/add/
null value in column "name" violates not-null constraint
Cela ne s'est jamais produit auparavant. Je sais que le nom ne doit pas être Null
, mais j'ajoute toujours un enregistrement. Comment est-ce possible?
Cela a une réponse courte ici .
Si vous spécifiez un champ comme champ non nul Django vous demandera soit de fournir une valeur par défaut dans le code lui-même, soit il vous demandera de fournir une valeur par défaut lorsque vous exécutez des migrations . Une meilleure approche serait de fournir une valeur par défaut saine dans votre models.py lui-même. Après cela, exécutez python manage.py makemigrations
et python manage.py migrate
. Ça devrait aller.
Ce problème est dû en partie à une mauvaise utilisation de CharField
et TextField
. Vous devriez presque ne jamais utiliser null=True
sur ces champs et leurs sous-classes. https://docs.djangoproject.com/en/1.11/ref/models/fields/#Django.db.models.Field.null
Évitez d'utiliser null sur des champs basés sur des chaînes tels que CharField et TextField. Si un champ basé sur une chaîne a null = True, cela signifie qu'il a deux valeurs possibles pour "aucune donnée": NULL et la chaîne vide. Dans la plupart des cas, il est redondant d'avoir deux valeurs possibles pour "pas de données;" la convention Django consiste à utiliser la chaîne vide, pas NULL. Une exception est lorsqu'un CharField a à la fois unique = True et blank = True set. Dans cette situation, null = True est requis pour éviter les violations de contraintes uniques lors de l'enregistrement de plusieurs objets avec des valeurs vides.
Je suggère fortement de supprimer ce paramètre de vos CharField
s et TextField
s.
Aussi juste pour être sûr d'exécuter ./manage.py makemigrations && ./manage.py migrate
.