web-dev-qa-db-ja.com

Django-adminでいくつかのフィールドを非表示にする方法は?

class Book(models.Model):
    title = models.CharField(..., null=True)
    type = models.CharField(...)
    author = models.CharField(...)

Models.pyに簡単なクラスがあります。 adminでは、保存された本のタイプが1のときに本のタイトルを(本の詳細フォームで)非表示にしたいと思います。これを最も簡単な方法で行うにはどうすればよいですか?

49
pmoniq

モジュールに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
18
Aleksej Vasinov

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', )
106
Lorenz Lo Sauer

Apropos @Lorenz @mrts回答

with Django 2.1フィールドがfields =で既に指定されている場合、excludeは機能しないことがわかりました。

その場合は、使用することがあります

self.fields.remove('title')

これを機能させるには、フィールドをリスト[]として定義する必要があります

0
mb_atx