使用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.name
get_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 item
get_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.name
get_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.desc
get_desc.short_description = '歌单描述'
def get_playnum(self):
return self.playnum
get_playnum.short_description = '播放量'
def get_addtime(self):
return self.addtime
get_addtime.short_description = '创建时间'
def get_updatetime(self):
return self.updatetime
get_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,
)
效果:
总结
至此后台功能开发和优化算基本完成,之后开始前端方面开发。