2011-08-09 28 views
25

Tôi đã đặt trường Mô hình của mình thành null=True, cho phép NULL trong MySQL, nhưng tôi dường như không thể gán NULL cho trường thông qua Quản trị viên Django. Tôi đã thử cũng thiết lập blank=True, nhưng điều đó chỉ đặt trường vào một chuỗi rỗng. Sau this không hoạt động, vì giá trị trường được đặt thành "Không", chuỗi.Làm cách nào để cho phép quản trị viên django đặt trường thành NULL?

Bất kỳ ý tưởng nào?

Trả lời

23

Cố gắng ghi đè lên các phương pháp tiết kiệm() của mô hình, để kiểm tra giá trị rỗng:

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

Thông thường, khi bạn vượt qua cả hai null=Trueblank=True, nếu bạn để trống trường này trong quản trị viên, Django sẽ sử dụng NULL cho giá trị của nó.

EDIT:

như agf giải thích trong câu trả lời của mình, điều này là đúng cho tất cả các loại trừ CharFieldTextField.

+1

Nhưng nó không. – Hubro

13

This section in the docs làm cho âm thanh như bạn không thể đặt trường dựa trên chuỗi thành NULL thông qua quản trị viên; nó sẽ sử dụng chuỗi rỗng. Đây chỉ là cách Django làm điều đó. Nó sẽ làm việc cho các loại trường khác.

Bạn sẽ phải hack trên tập lệnh quản trị hoặc người nào khác quyết định không thực sự cần phải là NULL trong cơ sở dữ liệu; một chuỗi rỗng là OK.

+0

không bao giờ nhận thấy chi tiết này, điều cần biết! – MatToufoutu

+6

+1 Nếu trường bạn đang xử lý được đặt là 'unique', thì tùy chọn duy nhất là" hack quản trị " – Caumons

+0

Tôi đang sử dụng null trong ForeignKey, và nó vẫn không cho phép nó là rỗng. Vì vậy, nó không phải là một vấn đề liên quan đến chuỗi. – Anoyz

3

Tôi thường sử dụng Django chỉ dành cho quản lý và cần phải giữ gìn rất nhiều NULLs trong db. Tôi sử dụng đoạn mã này để đặt tất cả các chuỗi trống trên một đối tượng cụ thể thành 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

thử mã này, đây Language.subregion Hass null = Đúng mã này ghi đè các thiết lập quản trị hình thức (LanguageAdmin) và bộ "tiểu vùng" lĩnh vực bất động sản - cần thiết để 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) 
Các vấn đề liên quan