list_display展示多對多關系的內容
表結構關系
表一
class Server(models.Model):
asset = models.OneToOneField('Asset')
created_by_choices = (
('auto','Auto'),
('manual','Manual'),
)
created_by = models.CharField(choices=created_by_choices,max_length=32,default='auto') #auto: auto created, manual:created manually
hosted_on = models.ForeignKey('self',related_name='hosted_on_server',blank=True,null=True) #for vitural server
model = models.CharField(u'型號',max_length=128,null=True, blank=True )
# 若有多個CPU,型號應該都是一致的,故沒做ForeignKey
raid_type = models.CharField(u'raid類型',max_length=512, blank=True,null=True)
os_type = models.CharField(u'操作系統類型',max_length=64, blank=True,null=True)
os_distribution =models.CharField(u'發型版本',max_length=64, blank=True,null=True)
os_release = models.CharField(u'操作系統版本',max_length=64, blank=True,null=True)
salt_minion_id = models.CharField(u'salt minion id',max_length=254,blank=True,null=True)
create_date = models.DateTimeField(blank=True, auto_now_add=True)
update_date = models.DateTimeField(blank=True,null=True)
class Meta:
verbose_name = '服務器'
verbose_name_plural = "服務器"
def __str__(self):
return '%s sn:%s' %(self.asset.name,self.asset.sn)
表二
class SaltGroup(models.Model):
'''
saltstack 的minion組管理
'''
group_name = models.CharField(u'組名',max_length=50)
host_target = models.ManyToManyField(Server,verbose_name='組成員',null=True,blank=True)
whether_create = models.IntegerField(u'是否創建了組在saltstack配置文件里',default=0) #0:沒有創建,1:表示創建了
class Meta:
db_table = "saltstack組"
然后我們在admin配置文件這么寫:
class Saltstack_GroupAdmin(admin.ModelAdmin):
list_display = ['group_name','salt_minion_id'] # 這里需要注意的是,salt_minion_id是我們要在前端展示的內容,自己定義的
def salt_minion_id(self,obj):
'''
這個方法就是用來對salt_minion_id這個字段做處理,把我們需要展示的前端內容截取出來。需要注意的是,方法名必須要和在list_display里面的一致,這樣才可以調用。
'''
print(obj.host_target.salt_minion_id)
return obj.host_target.salt_minion_id # host_target是我們SaltGroup表中多對多的字段,salt_minion_id是剛才我們自定義的字段,
salt_minion_id.short_description = "Minion's ID " # 對salt_minion_id這個做個簡短的title。
admin.site.register(models.SaltGroup,Saltstack_GroupAdmin),
好了至此,重啟下django即可在django admin界面下使用了
list_display展示外鍵內容
首先看看表結構關系
表一
class DockerContainers(models.Model):
'''
用來記錄docker容器信息的
'''
Real_host_ip = models.ForeignKey(DockerOfHost,verbose_name='Docker宿主機IP') # 這段是外鍵
Container_id = models.CharField(u'容器ID',max_length=400,primary_key=True,unique=True)
Container_name = models.CharField(u'容器名字',max_length=300,null=True,blank=True)
Container_image = models.CharField(u'容器鏡像',max_length=300)
Container_Image_id = models.CharField(u'鏡像ID',max_length=500,null=True,blank=True)
Command = models.CharField(u'運行的命令',max_length=300,null=True,blank=True)
Created = models.CharField(u'創建時間',max_length=200)
Status = models.CharField(u'運行狀態',max_length=100,null=True,blank=True)
Port = models.CharField(u'容器端口',max_length=1000,null=True,blank=True)
SizeRw = models.IntegerField(null=True,blank=True)
SizeRootFs = models.IntegerField(null=True,blank=True)
Host_config = models.CharField(u'主機配置',max_length=1024,null=True,blank=True)
Network_settings = models.CharField(u'網絡配置',max_length=3000,null=True,blank=True)
Mounts = models.CharField(u'掛載目錄',max_length=1024,null=True,blank=True)
Record_time = models.DateTimeField(u'數據更新時間',auto_now=True)
def __str__(self):
return "%s:%s"%(self.Real_host_ip,self.Container_id)
class Meta:
verbose_name = "Docker容器信息"
verbose_name_plural = "Docker容器信息"
表二:
class DockerOfHost(models.Model):
'''
用來記錄docker宿主機信息到
'''
host_ip = models.CharField(u'Docker宿主機IP',max_length=250,unique=True)
def __str__(self):
return self.host_ip # 一定要retrun self.ip,這樣list_display才能顯示
class Meta:
verbose_name = "Docker宿主機IP"
verbose_name_plural = "Docker宿主機IP"
admin.py里的代碼如下:
class dockercontainers(admin.ModelAdmin):
list_display = ['Real_host_ip','Container_id','Container_name','Container_image','Container_Image_id','Command','Created','Status',\
'Port','SizeRw','SizeRootFs','Host_config','Network_settings','Mounts','Record_time']
search_fields = ['Container_id','Container_name','Container_image','Status']
其實最關鍵的一步在於表二里的__str__方法return回來的內容,套用官網的一句話就是:If the field is a ForeignKey, Django will display the str() (unicode() on Python 2) of the related object. If you don’t set list_display, the admin site will display a single column that displays the str() (unicode() on Python 2) representation of each object.
更多資料可以參考官網:https://docs.djangoproject.com/en/1.10/ref/contrib/admin/
