每次写admin时,都得各种百度,chatgpt,统一记录一下吧。
- models.py
class DBMenu(models.Model):
id = models.CharField(verbose_name='ID', default=id_generater.get_MEU_id, max_length=50, primary_key=True)
name = models.CharField(verbose_name='菜单名称', max_length=100)
url = models.CharField(verbose_name='链接地址', max_length=400, default="")
parent = models.ForeignKey(verbose_name='父菜单', to='self', on_delete=models.CASCADE, null=True, blank=True)
permission_group = models.ForeignKey(verbose_name='权限组', to=DBPermissionGroup, on_delete=models.CASCADE)
# 方便admin左侧显示表名
class Meta:
verbose_name = '菜单'
verbose_name_plural = '菜单s'
# 输出对象名,都会调用这个方法,所以最后输出的是该对象的名称
def __str__(self):
return self.name
- admin.py
class DBMenuAdmin(admin.ModelAdmin):
# admin中展示字段
list_display = ['name', 'id', 'url', 'get_parent_descriptions', 'get_permission_group_descriptions']
# admin中可以链接的字段,链接到该数据内部
list_display_links = ['name', 'id', 'url', 'get_parent_descriptions', 'get_permission_group_descriptions']
# 方便显示关于外键字段的内容
def get_permission_group_descriptions(self, obj):
return obj.permission_group.name if obj.permission_group and obj.permission_group.name else ""
# 显示外键字段的列名
get_permission_group_descriptions.short_description = '权限组名称'
def get_parent_descriptions(self, obj):
return obj.parent.name if obj.parent and obj.parent.name else ""
get_parent_descriptions.short_description = '父菜单名称'
admin.site.register(DBMenu, DBMenuAdmin)