53 votes

Comment puis-je autoriser l'administrateur de Django à définir un champ sur NULL ?

J'ai défini mon champ Model sur null=True , ce qui autorise NULL dans MySQL, mais je n'arrive pas à affecter NULL au champ via Django Admin. J'ai également essayé de définir blank=True , mais cela définit simplement le champ sur une chaîne vide. Cela n'a pas fonctionné non plus, car la valeur du champ a été définie sur "Aucun", la chaîne.

Des idées?

45voto

rewritten Points 7430

Essayez d'écraser la méthode save() du modèle, pour vérifier les valeurs vides :

 class MyModel(models.Model):

    my_nullable_string = models.CharField(max_length=15, null=True, blank=True)

    def save(self, *args, **kwargs):
         if not self.my_nullable_string:
              self.my_nullable_string = None
         super(MyModel, self).save(*args, **kwargs)

20voto

agf Points 45052

Cette section de la documentation donne l'impression que vous ne pouvez pas définir un champ basé sur une chaîne sur NULL via l'administrateur ; il utilisera la chaîne vide. C'est ainsi que Django procède. Cela fonctionnera pour d'autres types de champs.

Vous devrez soit pirater le script d'administration, soit décider qu'il n'a pas vraiment besoin d'être NULL dans la base de données ; une chaîne vide est OK.

11voto

pymen Points 49

essayez ce code, ici Language.subregion hass null=True ce code écrase les paramètres du formulaire d'administration (LanguageAdmin) et définit la propriété de champ "sous-région" - requise sur False

 from app.models import Language
from django.contrib import admin

class Language(models.Model):
    subregion = models.ForeignKey(SubRegion, null=True)
    code = models.CharField(max_length=10, unique=True)

class LanguageAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        form = super(LanguageAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['subregion'].required = False
        return form

admin.site.register(Language, LanguageAdmin)

9voto

MatToufoutu Points 5879

Habituellement, lorsque vous passez à la fois null=True et blank=True , si vous laissez le champ vide dans l'administrateur, Django utilisera NULL pour son valeur.

ÉDITER:

comme l' agf dans sa réponse, cela est vrai pour tous les types sauf CharField et TextField .

5voto

Mark Phillip Points 719

J'utilise souvent Django uniquement pour l'administrateur et j'ai besoin de conserver beaucoup de valeurs NULL dans la base de données. J'utilise cet extrait pour définir toutes les chaînes vides sur un objet particulier sur NULL.

 def save(self, *args, **kwargs):
    for var in vars(self):
        if not var.startswith('_'):
            if self.__dict__[var] == '':
                self.__dict__[var] = None
    super(MyModel, self).save(*args, **kwargs)

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