使用Python Django框架制作一个音乐网站,
本篇主要是后台对歌曲类型、歌单功能原有功能进行部分功能实现和显示优化。
目录
歌曲类型功能优化
新增编辑
优化输入项标题显示
父类型显示改为下拉菜单
列表显示
父类型显示名称
过滤器增加父类型
歌单表功能优化
新增编辑
单曲选项增加歌手名称
歌单类型选项名称修改
字段显示名称修改
播放量改为不可编辑
歌单增加描述字段
首先表模型中增加描述字段
执行表迁移
列表显示
显示播放量、添加时间
显示编辑时间、歌单描述
歌单封面改为显示图片
总结
歌曲类型功能优化
新增编辑
优化输入项标题显示
把显示字段名称改为显示名称
内容如下:
class SongCategory(models.Model):""" 歌曲类型表 """class Meta:verbose_name = '歌曲类型'verbose_name_plural = '歌曲类型'name = models.CharField('类型名称', max_length=100, help_text='请输入类型名称')pid = models.IntegerField('父类型id', default=0, help_text='父类型')
效果:
父类型显示改为下拉菜单
父类型字段增加choice参数,就可变成下拉菜单选项,需要注意字段类型为tuple。
内容如下:
categoryChoice = [(0, '默认'), (1, '主题'), (2, '心情'),(3, '场景'),(4, '年代'),(5, '曲风流派'), (6, '语言')
]
pid = models.IntegerField('父类型', default=0, help_text='父类型',choices=categoryChoice
)
效果:
原本想做成表模型调用自己的父类型组成列表来展示和添加;结果发现表模型没创建时候,这个表模型是不存在的,也就无法调用,暂时先做成固定父类型,添加子类型。
列表显示
父类型显示名称
默认显示父类型是类型id,改为显示类型名称。
修改player/admin.py中的歌曲类型后台类中对pid字段返回内容。
class SongCategoryAdmin(admin.ModelAdmin):""" 后台歌单类型类 """def get_name(self):return self.nameget_name.short_description = '类型名称'def get_pid(self):categoryChoice = [(0, '默认'),(1, '主题'),(2, '心情'),(3, '场景'),(4, '年代'),(5, '曲风流派'),(6, '语言')]for index, item in categoryChoice:if index == self.pid:return itemget_pid.short_description = '父类型'
效果:
过滤器增加父类型
过滤器中增加pid字段设置,可以设置在name的前面。
内容如下:
list_filter = ['pid', 'name']
效果:
歌单表功能优化
新增编辑
单曲选项增加歌手名称
修改单曲表字符串返回格式。
内容如下:
class Singe(BaseModel):""" 单曲表 """......def __str__(self):return str(self.name) + ' - ' + str(self.singler)
效果:
歌单类型选项名称修改
默认显示对象,需要修改歌曲类型表模型类,增加__str__方法,设置返回格式。
内容如下:
def __str__(self):return self.name
效果:
字段显示名称修改
默认显示字段名称,需要改成字段表述的内容,这样便于理解和编辑。
修改player/models.py中歌单表模型类,设置字段的verbose_name属性。
内容如下:
class SongSheet(BaseModel):""" 歌单表 """class Meta:verbose_name = '歌单'verbose_name_plural = '歌单'name = models.CharField('歌单名称', max_length=100, help_text='请输入歌单名称')cover = models.ImageField('歌单封面图',upload_to=upload_save_path, help_text='请上传歌单封面图')playnum = models.IntegerField('播放量', default=0, help_text='请输入播放量')is_default = models.IntegerField('默认', default=0, choices=[('0', '是'), ('1', '否')], help_text='是否默认')# 歌曲类型与歌单表 多对多关系category = models.ManyToManyField('SongCategory', verbose_name='所属类型')# 歌单表与单曲表多对多关系singe = models.ManyToManyField('Singe', verbose_name='包含单曲')
效果:
播放量改为不可编辑
播放量是由前端查看歌单后增加数量,后台不能编辑。
需要设定播放量字段的editable为False。
内容如下:
playnum = models.IntegerField(default=0, editable=False)
保存后,新增和编辑中播放量填写项不再显示。
歌单增加描述字段
刚发现设计表时候没有歌单描述字段,现在加上。
首先表模型中增加描述字段
内容如下:
esc = models.TextField('歌单描述', default='', max_length=200, help_text='请输入歌单描述')
注意:需要设置默认,否则无法执行。
执行表迁移
表模型发生改变后,需要创建表迁移文件和执行表迁移。
python manage.py makemigrations
python manage.py migrate
数据表增加desc字段
列表显示
显示播放量、添加时间
显示编辑时间、歌单描述
修改player/admin.py中歌单表后台类。
内容如下:
class SongSheetAdmin(admin.ModelAdmin):""" 后台歌单类 """def get_name(self):return self.nameget_name.short_description = '类型名称'def get_cover(self):return format_html('<img src="/media/{}" width="100px" height="100px"/>',self.cover,)get_cover.short_description = '歌单封面'def get_desc(self):return self.descget_desc.short_description = '歌单描述'def get_playnum(self):return self.playnumget_playnum.short_description = '播放量'def get_addtime(self):return self.addtimeget_addtime.short_description = '创建时间'def get_updatetime(self):return self.updatetimeget_updatetime.short_description = '编辑时间'# 显示字段list_display = ['id', get_name, get_cover, get_desc, get_playnum, get_addtime, get_updatetime]
效果:
歌单封面改为显示图片
修改player/admin.py中歌单表后台类;把封面方法返回内容改为img元素。
内容如下:
def get_cover(self):return format_html('<img src="/media/{}" width="100px" height="100px"/>',self.cover,)
效果:
总结
至此后台功能开发和优化算基本完成,之后开始前端方面开发。