Djangoは、主キーのフラグが付けられたフィールドがDjango管理インターフェースで表示/編集されないようにします。
主キーを指定したい場合としたくない場合があるデータを入力したいとします。管理インターフェースに主キーを表示するにはどうすればよいですか?また、それをオプションとして指定するにはどうすればよいですか?
また、Django admin内の 'id'(主キー)を表示したかったのですが、必ずしも編集する必要はありません。readonly_fields
リストに追加しただけで、表示されました。 IE:
class StudentEnrollmentInline(admin.TabularInline):
model = Enrollment
readonly_fields=('id',)
一方、「フィールド」リストに追加しようとすると、Djangoは、フィールドが存在しないと言って私に腹を立てました...
モデルで主キーフィールドを明示的に指定すると(primary_key=True
を使用)、管理者で編集できるようになります。
Django ./manage.py syncdb
を介して作成されたモデルの場合、次の主キーフィールドが自動的に追加されます。
id = models.AutoField(primary_key=True)
それをIntegerField主キーとしてモデルに明示的に変更(または追加)すると、adminを使用して直接編集できるようになります。
id = models.IntegerField(primary_key=True)
しかし、他の人が指摘したように、これは潜在的な地雷原です...
Djangoのドキュメント には、それについての短い文がありますが、これは明確ではありません。
フィールドもフィールドセットオプションも存在しない場合、Djangoは、デフォルトで、AutoFieldではなく、すべてのフィールドセットで、フィールドと同じ順序でeditable = Trueを持つ各フィールドを表示します。モデルで定義されています。
理由は、Django AutoField
を編集することを許可していません(これは自動インクリメント値であり、編集すべきではないため、これは正しいことです)。 @ mnelson4の答えは、それを表示するための良いアプローチです。
データベースでデフォルトで「id」の列名を持つ主キーを表示するには、「pk」を使用します
def __str__(self):
return '{} - {} ({})'.format(self.pk, self.name, self.pcode)
オプションの主キーを持つことは意味がありません。 PKは自動インクリメントである場合(編集する必要はありません)、または手動で指定する場合(この場合は常に必要です)のいずれかです。
なぜこれが必要なのですか?
投票数が最も多い回答 私にはうまくいきませんでした。ゲッターが必要でした。
class StudentEnrollmentInline(admin.TabularInline):
model = Enrollment
readonly_fields=('student_enrollment_id',)
def student_enrollment_id(self, obj):
return obj.id
Django 1.11を使用する