我们在Django存储图片的时候,并不是直接存储图片,而是存储图片的唯一标识,再通过标识去获取图片,例如下面的模型类有一个image字段,字段类型是ImageField
class SKUImage(BaseModel):
sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku')
image = models.ImageField(verbose_name='图片') # 存储图片
class Meta:
db_table = 'tb_sku_image'
def __str__(self):
return '%s %s' % (self.sku.name, self.id)
ImageField类型有一个url属性,返回的是该图片的URL链接(就是唯一标识),目前是这样的
im.image.url得到的只是原本的图片标识,我们想要的是一个带域名的完整URL链接,所以我们需要自定义存储后端,并改写url()函数返回完整图片链接
1.自定义存储后端
新建一个py文件,例如fastdfs.py
新建一个类,继承Storage,并且重写url()方法,把该方法的name参数拼接上自定义的字符串再返回
from django.core.files.storage import Storage
class FastDFSStorage(Storage):
def _open(self,name,mode='rb'):
# 打开django本地文件
pass
def _save(self,name,content,max_length=None):
# 上传图片
pass
# 给返回的图片标识加上前缀
def url(self, name):
return "http://image.mysite.site:8888/" + name
2.修改配置文件
修改配置文件,告诉Django要使用我们自定义的存储后端
# 指定自定义的Django文件存储类
DEFAULT_FILE_STORAGE = 'xxxxxx.utils.fastdfs.FastDFSStorage'
其他类似操作