web-dev-qa-db-ja.com

Django adminがフィールドをNULLに設定できるようにするにはどうすればよいですか?

MySQLでNULLを許可するnull=Trueにモデルフィールドを設定しましたが、Django Adminを介してフィールドにNULLを割り当てることができません。私も試してみましたblank=Trueを設定しますが、これはフィールドを空の文字列に設定するだけです this の後には、フィールド値が文字列 "None"に設定されていたため、機能しませんでした。

何か案は?

37
Hubro

空の値をチェックするために、モデルの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)
33
rewritten

ドキュメントのこのセクション を使用すると、できない文字列ベースのフィールドを管理者がNULLに設定できないように聞こえます。空の文字列を使用します。これはまさにDjangoが行う方法です。他のタイプのフィールドでも機能します。

管理スクリプトをハックするか、そうでないと判断する必要がありますreallyデータベースでNULLにする必要があります。空の文字列でも問題ありません。

17
agf

通常、両方を渡すとnull=Trueおよびblank=True、管理者のフィールドを空白のままにすると、Djangoはその値にNULLを使用します。

編集:

agfが彼の回答で説明しているように、これはCharFieldTextFieldを除くすべての型に当てはまります。

8
mdeous

このコードを試してください。ここで、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)
6
pymen

私はよくDjangoを管理者のためだけに使用し、dbに多くのNULLを保持する必要があります。このスニペットを使用して、特定のオブジェクトのすべての空の文字列を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)
4
Mark Phillip

これはDjango= 2.0.1で修正されています-そのバージョン以降、空の値はnull可能なCharfieldsのNoneとして保存されます。

チケット: https://code.djangoproject.com/ticket/4136

コミット: https://github.com/Django/django/commit/267dc4adddd2882182f71a7f285a06b1d4b15af

3
Symmetric