2011-08-09 34 views
25

我已經將我的模型字段設置爲null=True,它允許在MySQL中爲NULL,但我似乎無法通過Django Admin將空值分配給該字段。我也試過設置blank=True,但是這只是將字段設置爲空字符串。在this之後也沒有工作,因爲字段值被設置爲「無」字符串。如何讓django admin將字段設置爲NULL?

任何想法?

回答

23

嘗試覆蓋模型的save()方法,以檢查空值:

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

通常,當您同時通過null=Trueblank=True時,如果將該字段留在管理員中,則Django將使用NULL作爲其值。

編輯:

agf在他的回答解釋說,這是對所有類型除了CharFieldTextField如此。

+1

但事實並非如此。 – Hubro

13

This section in the docs使它聽起來像你不能通過管理員設置一個基於字符串的字段爲NULL;它將使用空字符串。這只是Django的做法。它將適用於其他類型的領域。

你要麼必須破解管理腳本,否則決定它不真的需要在數據庫中爲NULL;一個空字符串是可以的。

+0

從來沒有注意到這個細節,很高興知道! – MatToufoutu

+6

+1如果你正在處理的字段設置爲「唯一」,那麼唯一的選擇是「黑客管理員」 – Caumons

+0

我在ForeignKey中使用null,它仍然不允許它爲空。所以這不是一個字符串相關的問題。 – Anoyz

3

我經常使用Django只爲管理員和需要保存大量的空值的分貝。我使用這段代碼將特定對象上的所有空字符串設置爲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

試試這個代碼,這裏Language.subregion HASS空=真 這段代碼覆蓋管理員設置的形式(LanguageAdmin)和套「次區域」字段屬性 - 需要假

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) 
相關問題