2011-08-09 12 views

Odpowiedz

23

próbował nadpisać metodę save() modelu, aby sprawdzić pustych wartości:

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

Zazwyczaj, kiedy przechodzą zarówno null=True i blank=True, jeśli zostawisz to pole puste w admin, Django użyje NULL dla jego wartości.

EDIT:

jak agf wyjaśnia w swojej odpowiedzi, to jest prawdziwe dla wszystkich typów z wyjątkiem CharField i TextField.

+1

Ale tak nie jest. – Hubro

13

This section in the docs brzmi jak ty nie może ustawić pole oparte na łańcuchach na NULL przez administratora; użyje pustego ciągu. Tak właśnie robi Django. Będzie działać dla innych typów pól.

Musisz albo włamać się do skryptu administratora, albo zdecydować, że nie musi to byćw bazie danych; pusty ciąg jest OK.

+0

nigdy nie zauważyłem tego szczegółu, dobrze wiedzieć! – MatToufoutu

+6

+1 Jeśli pole, z którym mamy do czynienia, jest ustawione na "unikalne", wtedy jedyną opcją jest "hakowanie administratora". – Caumons

+0

Używam wartości null w kodzie obcym i nadal nie pozwala ona na zerowanie. Więc nie jest to problem związany z łańcuchem. – Anoyz

3

często używam Django tylko dla administratora i trzeba zachować wiele wartości null w db. Używam tego fragmentu, aby ustawić puste ciągi na konkretnym obiekcie na 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

spróbuj tego kodu, tutaj Language.subregion Hass wartość null = True ten kod administratora nadpisuje ustawienia postaci (LanguageAdmin) oraz zestawy "podregion" własność pola - wymagany do fałszywych

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) 
Powiązane problemy