2011-08-09 97 views
25

Establecí mi campo Model en null=True, lo que permite NULL en MySQL, pero parece que no puedo asignar NULL al campo a través de Django Admin. También intenté configurar blank=True, pero eso solo establece el campo en una cadena vacía. El siguiente this tampoco funcionó, ya que el valor del campo se estableció en "Ninguno", la cadena.¿Cómo puedo permitir que django admin configure un campo en NULL?

¿Alguna idea?

Respuesta

23

intente sustituir el método save() del modelo, para comprobar si hay valores vacíos:

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) 
5

Por lo general, cuando se pasa tanto null=True y blank=True, si deja el campo en blanco en el admin, Django utilizará NULL por su valor.

EDIT:

como agf explica en su respuesta, esto es cierto para todos los tipos excepto CharField y TextField.

+1

pero no es así. – Hubro

13

This section in the docs suena como que no se puede establecer un campo basado en cadena de NULL a través del administrador; usará la cadena vacía. Así es como lo hace Django. Funcionará para otros tipos de campos.

Deberá hackear el script de administración o bien decidir que no realmente debe ser NULL en la base de datos; una cadena vacía está bien.

+0

nunca noté este detalle, ¡es bueno saberlo! – MatToufoutu

+6

+1 Si el campo que está tratando está configurado para ser 'único', entonces la única opción es" piratear el administrador " – Caumons

+0

Estoy usando nulo en una clave externa, y todavía no permite que sea nulo. Entonces, no es un problema relacionado con cuerdas. – Anoyz

3

que a menudo utilizan Django sólo para la administración y la necesidad de preservar una gran cantidad de valores NULL en el PP. Utilizo este fragmento para establecer todas las cadenas vacías en un objeto particular en 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) 
3

probar este código, aquí Language.subregion Hass nula = True este código sobrescribe la configuración de administrador de formulario (LanguageAdmin) y conjuntos de "subregión" propiedad de campo - Falso necesarios para

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) 
Cuestiones relacionadas