如何在Django中隐藏适配list_editable的list_display_links对应ID列
Django Admin 隐藏
list_display_links指定的ID列解决方案 问题背景
定义如下Person模型:
# "store/models.py" from django.db import models class Person(models.Model): first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=20)
在Django Admin中配置字段可编辑时,编写了如下代码:
# "store/admin.py" from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): list_display = ("first_name", "last_name") list_editable = ("first_name", "last_name")
触发错误:
ERRORS: <class 'store.admin.PersonAdmin'>: (admin.E124) The value of 'list_editable[0]' refers to the first field in 'list_display' ('first_name'), which cannot be used unless 'list_display_links' is set.
添加id到list_display和list_display_links后错误解决,但列表页面多出不需要的ID列,需隐藏该列。
解决方案
方法1:自定义空字段作为链接目标
创建无内容的自定义字段作为list_display_links的目标,既满足Django的规则,又不会显示额外列:
# "store/admin.py" from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): list_display = ("first_name", "last_name", "_dummy_link") list_editable = ("first_name", "last_name") list_display_links = ("_dummy_link", ) def _dummy_link(self, obj): return "" _dummy_link.short_description = "" _dummy_link.admin_order_field = None
此方案下,列表页面仅显示first_name和last_name可编辑列,点击行内空白区域仍能进入详情页。
方法2:通过CSS隐藏ID列
若不想修改Python逻辑,可通过自定义Admin CSS隐藏ID列:
- 在项目中创建
admin/css/hide_id.css文件:
th.column-id, td.column-id { display: none; }
- 在
PersonAdmin中引入该CSS:
# "store/admin.py" from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): list_display = ("first_name", "last_name", "id") list_editable = ("first_name", "last_name") list_display_links = ("id", ) class Media: css = { 'all': ('admin/css/hide_id.css',) }
需确保Django静态文件配置正确,能读取到该CSS文件。
方案对比
- 方法1为纯Python实现,无需处理静态文件,简洁稳定,推荐使用。
- 方法2适合临时快速隐藏列,但依赖Admin样式结构,若官方样式更新可能失效。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

