5 Django系列之通過list_display展示多對多與外鍵內容在admin-web界面下


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM