Подтвердить что ты не робот

Как разрешить django admin установить поле в NULL?

Я установил для моего поля Model значение null=True, что позволяет использовать NULL в MySQL, но я не могу назначить NULL в поле через Django Admin. Я также попытался установить blank=True, но это просто устанавливает поле в пустую строку. Вслед за этим также не работало, так как значение поля было установлено как "Нет", строка.

Любые идеи?

4b9b3361

Ответ 1

Попробуйте перезаписать метод 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)

Ответ 2

В этом разделе в документах звучит так, как будто вы не можете установить строковое поле в NULL через админ; он будет использовать пустую строку. Это так, как это делает Django. Он будет работать для других типов полей.

Вам придется либо взломать администратор script, либо решить, что на самом деле это не должно быть NULL в базе данных; пустая строка в порядке.

Ответ 3

Обычно, когда вы передаете оба null=True и blank=True, если вы оставите поле пустым в admin, Django будет использовать NULL для его значения.

EDIT:

как agf объясняет в своем ответе, это верно для всех типов, кроме CharField и TextField.

Ответ 4

Я часто использую Django только для администратора и должен сохранять много NULL в db. Я использую этот фрагмент, чтобы установить все пустые строки на конкретном объекте в 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)

Ответ 5

попробуйте этот код, здесь Language.subregion hass null = True этот код перезаписывает настройки формы администратора (LanguageAdmin) и устанавливает свойство поля "subregion" - требуется для 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)