我已經將我的模型字段設置爲null=True
,它允許在MySQL中爲NULL,但我似乎無法通過Django Admin將空值分配給該字段。我也試過設置blank=True
,但是這只是將字段設置爲空字符串。在this之後也沒有工作,因爲字段值被設置爲「無」字符串。如何讓django admin將字段設置爲NULL?
任何想法?
我已經將我的模型字段設置爲null=True
,它允許在MySQL中爲NULL,但我似乎無法通過Django Admin將空值分配給該字段。我也試過設置blank=True
,但是這只是將字段設置爲空字符串。在this之後也沒有工作,因爲字段值被設置爲「無」字符串。如何讓django admin將字段設置爲NULL?
任何想法?
嘗試覆蓋模型的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)
通常,當您同時通過null=True
和blank=True
時,如果將該字段留在管理員中,則Django
將使用NULL
作爲其值。
編輯:
如agf
在他的回答解釋說,這是對所有類型除了CharField
和TextField
如此。
This section in the docs使它聽起來像你不能通過管理員設置一個基於字符串的字段爲NULL
;它將使用空字符串。這只是Django的做法。它將適用於其他類型的領域。
你要麼必須破解管理腳本,否則決定它不真的需要在數據庫中爲NULL;一個空字符串是可以的。
從來沒有注意到這個細節,很高興知道! – MatToufoutu
+1如果你正在處理的字段設置爲「唯一」,那麼唯一的選擇是「黑客管理員」 – Caumons
我在ForeignKey中使用null,它仍然不允許它爲空。所以這不是一個字符串相關的問題。 – Anoyz
我經常使用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)
試試這個代碼,這裏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)
注意,這在Django 2.0.1中修復 - 從該版本開始,空值將被保存爲無可空字段。
票:https://code.djangoproject.com/ticket/4136
提交:https://github.com/django/django/commit/267dc4adddd2882182f71a7f285a06b1d4b15af0
但事實並非如此。 – Hubro