class Book(models.Model):
title = models.CharField(..., null=True)
type = models.CharField(...)
author = models.CharField(...)
Models.pyに簡単なクラスがあります。 adminでは、保存された本のタイプが1のときに本のタイトルを(本の詳細フォームで)非表示にしたいと思います。これを最も簡単な方法で行うにはどうすればよいですか?
モジュールにadmin.pyを作成します(おそらくbook)
class BookAdmin(admin.ModelAdmin):
list_display = ("pk", "get_title_or_nothing")
Book class:
class Book:
...
def get_title_or_nothing(self):
if self.type == WEIRD_TYPE:
return ""
return self.title
更新:
class BookAdmin(admin.ModelAdmin):
list_display = ("pk", "get_title_or_nothing")
def get_form(self, request, obj=None, **kwargs):
if obj.type == "1":
self.exclude = ("title", )
form = super(BookAdmin, self).get_form(request, obj, **kwargs)
return form
Django> 1.8の場合 adminで除外するフィールドを直接設定:
class PostCodesAdmin(admin.ModelAdmin):
exclude = ('pcname',)
非表示フィールドは、Field属性を設定することによりDjangoのORMで直接定義されます:editable = False
例えば.
class PostCodes(models.Model):
gisid = models.IntegerField(primary_key=True)
pcname = models.CharField(max_length=32, db_index=True, editable=False)
...
ただし、モデルのフィールドを直接設定または変更することが常に可能または有利であるとは限りません。原則として、次のadmin.py
セットアップは機能しますが、 exclude はInlineModelAdminオプションであるため機能しません。
class PostCodesAdmin(admin.ModelAdmin):
exclude = ('pcname',)
....
少なくともDjango 1.4(およびおそらくそれ以降のバージョン番号)で動作するソリューションは次のとおりです。
class PostCodesAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(PostCodesAdmin, self).get_form(request, obj, **kwargs)
del form.base_fields['enable_comments']
return form
アイテムの管理者リストビューの場合、必要のないフィールドを単に残すだけで十分です。
class PostCodesAdmin(admin.ModelAdmin):
list_display = ('id', 'gisid', 'title', )
Apropos @Lorenz @mrts回答
with Django 2.1フィールドがfields =で既に指定されている場合、excludeは機能しないことがわかりました。
その場合は、使用することがあります
self.fields.remove('title')
これを機能させるには、フィールドをリスト[]として定義する必要があります