目录
2.FileField 或 ImageField 字段上传中文文件名的文件
3.对 FileField 或 ImageField 上传的文件类型进行筛选(必须上传文件)
4.对 FileField上传的非空文件进行类型筛选(允许不上传文件或上传指定格式)
1. 在admin界面添加预览图
在模型界面( model.py )实例化一个类并继承django.db.models.Model
定义图片字段 img = models.ImageField('图片', upload_to="存储路径")
导入模块
#model.py
from django.utils.html import format_html #引入模块
def file_link(self): #函数名请随意
return format_html('<img src="{}" width="100px" />',
self.img.url)
file_link.short_description= '预览图' #函数名.short_description
#admin.py
list_displa = ['file_link']
exclude = ('file_link', ) #在增删数据时不显示(元组,必须加逗号)
2.FileField 或 ImageField 字段上传中文文件名的文件
上传文件的url 为/media/xxxx.txt
open文件时需要的路径为 media/xxxx.txt
所以需要对url进行[1::]切片
但是python字符串默认并非是unicode,如果在字符创中使用Unicode字符,如中文字符,必须要经过转换
#model.py
from django.utils.deconstruct import deconstructible
@deconstructible
class re_name(object): #继承object (新式类)
def __init__(self, path):
self.path = os.path.join(path, "%s")
def __call__(self, instance, filename): # __call__ 把当前实例变成可调用的对象
import pypinyin #把中文转成拼音的包
def pinyin(word):
s = ''
for i in pypinyin.pinyin(word, style=pypinyin.NORMAL):
#style=pypinyin.NORMAL 普通模式,不带音节
s += s.join(i)
return s
return self.path % (pinyin(filename))
3.对 FileField 或 ImageField 上传的文件类型进行筛选(必须上传文件)
#model.py
字段名 = models.FileField
(
'歌词',
upload_to=re_name('songLyric/'),
default='暂无歌词', #默认值
blank=True, #允许为空
validators = [ #自定义验证规则
validators.FileExtensionValidator(['txt','pdf'], message='歌词文件目前仅支持.txt与.pdf')
])
#若文件后缀 not in ['txt','pdf'] 返回message中的的错误信息到前端
4.对 FileField上传的非空文件进行类型筛选(允许不上传文件或上传指定格式)
#model.py
def fiel_content(value):
if value!="defaults" and value.name.split(".")[1] != "txt":
#如果value不为默认值(说明有数据上传)且上传的文件后缀不为.txt
raise ValidationError("歌词文件只允许.txt文件") #括号中为错误提示信息
#model.py
字段名 = models.FileField('测试',
upload_to=re_name('songLyric/'),
default='defaults', #不上传时的默认值
blank=True, #允许不上传
validators =[file_content] #file_content为上文的函数名
)
5.删除记录时自动删除上传的文件
使用FileField或ImageField时会向服务端上传文件,但当用户删除此条记录时,只能删除数据库中对文件路径的记录,无法删除源文件,故需要其他增加一些限制。(一定要写在定义class后)
#model.py
@receiver(pre_delete, sender=需要操作的model中的类名)
def mymodel_delete(sender, instance, **kwargs):
instance.file.delete(False)
6.使用simpleui美化后台
首先pip install simpleui
然后在settings.py的 INSTALLED_APPS 首行添加‘simpleui’
随后在git中找到simpleui的源码,将其中的simpleui目录下的templatetags文件夹全部拷贝到:
项目文件夹/venv(虚拟环境)/Lib/site-packages/simpleui/文件夹中