接【实例:利用Django管理后台管理IP地址】(二)创建后台管理员和自定义的表模型
上节已经成功在admin注册了自定义的models了,现在根据我们的需求,定制相关数据的展示。
需求包括:
1、表字段包括:ip地址、ip使用状态、使用人ID、使用人用户名、备注信息、非法使用天数、无法连接天数
2、ip使用状态只有两种可选:空闲、使用中
3、使用人用户名从后台管理用户里面选择
4、查询列表能显示ip地址、ip使用状态、使用人用户名、备注信息、非法使用天数、无法连接天数
5、编辑表单仅显示ip地址、ip使用状态、使用人用户名、备注信息
6、最好能模糊查询匹配ip地址、使用人用户名、备注信息
models.py修改为:
from django.db import models from django.contrib import auth # Create your models here. class ipaddr_info(models.Model): ipaddr = models.CharField(max_length=20, verbose_name="IP地址") ipstatus_choices = ( (0, "空闲"), (1, "使用中")) ipstatus = models.SmallIntegerField(verbose_name="IP状态", choices=ipstatus_choices) # userid暂时没有使用 userid = models.IntegerField(default=0, blank=True, null=True) username = models.ForeignKey('auth.User', on_delete=models.SET_NULL, blank=True, null=True, verbose_name="使用人") comment = models.TextField(max_length=256, blank=True, null=True, verbose_name="备注") disconnect_alarm_num = models.IntegerField(default=0, verbose_name="无法连接告警(天)") connect_alarm_num = models.IntegerField(default=0, verbose_name="非法使用告警(天)") def __str__(self): return u'%s %d %d %d'% (self.ipaddr, self.ipstatus, self.disconnect_alarm_num, self.connect_alarm_num)
注意:
1、verbose_name自定义在前端显示的字段名称
2、使用choices限制可输入数据,还可通过键值对自定义可选数据在前端显示的名称
3、blank=True, 允许空字符串写入,但是程序写入数据过程中,可能会写入null值,所以加上null=True
4、使用人username作为外键和用户表auth.User连接(一个ip地址只能写一个使用人,一个用户可以使用很多ip地址)
5、对于外键,删除是是默认为级联删除,当删除一个,对应相关数据也会被删除,所以,我们尽量显示设置这个属性,在创建外键是使用on_delete即可
1 CASCADE:这就是默认的选项,级联删除,你无需显性指定它。 2 PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。 3 SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。 4 SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。 5 SET(): 自定义一个值,该值当然只能是对应的实体了
因为删除用户并不需要删除对应的ip地址,所以,如果使用人被删除了,就将用户一项设置为null即可;同时,要记得null=True
6、default=0设置默认值,创建每一条数据如果没有设置该字段,则默认写入0
admin.py修改为:
from django.contrib import admin from mysiteapp.models import ipaddr_info # Register your models here. class IpaddrAdmin(admin.ModelAdmin):
#列表显示字段 list_display = ('ipaddr', 'ipstatus', 'username', 'comment', 'disconnect_alarm_num', 'connect_alarm_num')
#搜索字段 search_fields = ('ipaddr', 'username', 'comment')
#编辑字段 fields = ('ipaddr', 'ipstatus', 'username', 'comment') admin.site.register(ipaddr_info, IpaddrAdmin)
修改文档结构:
修改后的数据展示: