How to hide some fields in django-admin?

You are to create admin.py in your module (probably book)

class BookAdmin(admin.ModelAdmin):
    list_display = ("pk", "get_title_or_nothing")

In Book class:

class Book:
    ...
    def get_title_or_nothing(self):
        if self.type == WEIRD_TYPE:
            return ""
        return self.title

UPDATED:

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

For Django > 1.8 one can directly set the fields to be excluded in admin:

 class PostCodesAdmin(admin.ModelAdmin):
      exclude = ('pcname',)

Hidden fields are directly defined in Django's ORM by setting the Field attribute: editable = False

e.g.

class PostCodes(models.Model):
  gisid  = models.IntegerField(primary_key=True)
  pcname = models.CharField(max_length=32, db_index=True, editable=False)
  ...

However, setting or changing the model's fields directly may not always be possible or advantegous. In principle the following admin.py setup could work, but won't since exclude is an InlineModelAdmin option.

class PostCodesAdmin(admin.ModelAdmin):
     exclude = ('pcname',)
....

A solution working at least in Django 1.4 (and likely later version numbers) is:

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

For the admin list-view of the items, it suffices to simply leave out fields not required: e.g.

class PostCodesAdmin(admin.ModelAdmin):
  list_display = ('id', 'gisid', 'title', )