django中重写Storage中的url函数实现自动给mysql的Image属性链接增加域名出现{{ no such element: django.db.models.fields.files.ImageFieldFile object["url"] }}
1.根据课件上的教材重写Storage的url函数,方法如下:
from django.core.files.storage import Storage from django.conf import settings class FastDFSStorage(Storage): """自定义文件存储类""" def __init__(self, fdfs_base_url=None): """文件存储类的初始化方法""" # if not fdfs_base_url: # self.fdfs_base_url = settings.FDFS_BASE_URL # self.fdfs_base_url = fdfs_base_url self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL def _open(self, name, mode='rb'): """ 打开文件时会被调用的:文档告诉我必须重写 :param name: 文件路径 :param mode: 文件打开方式 :return: None """ # 因为当前不是去打开某个文件,所以这个方法目前无用,但是又必须重写,所以pass pass def _save(self, name, content): """ PS:将来后台管理系统中,需要在这个方法中实现文件上传到FastDFS服务器 保存文件时会被调用的:文档告诉我必须重写 :param name: 文件路径 :param content: 文件二进制内容 :return: None """ # 因为当前不是去保存文件,所以这个方法目前无用,但是又必须重写,所以pass pass def url(self, name): """ 返回文件的全路径 :param name: 文件相对路径 :return: 文件的全路径(http://fastdfs所在服务器域名/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg) """
# return "fastdfs所在服务器域名" + name
return self.fdfs_base_url + name
setting文件中增加:
DEFAULT_FILE_STORAGE = 'meiduo_mall.utils.fastdfs.fdfs_storage.FastDFSStorage' # FastDFS相关参数 FDFS_BASE_URL = fastdfs所在服务器域名
根据视频和课件,老师都能通过,jinja2模板引擎调用url方法,给image属性中的链接增加域名
但自己试了很多次就是不行,
出现如下错误:
分析原因可能是因为,django在启动时为调用重写的Storage方法,无法查明为什么没有调用.
在查找过程中发现,django其实已经封装了给image属性的链接增加域名的方法,如下:
方法为继承了Storage方法的FileSystemStorage方法:
FileSystemStorage中的url函数:
如下图base_url为如下函数:函数实现若_base_url存在则返回_base_url的值,若不存在则返回setting里的默认域名settings.MEDIA_URL
而_base_url则为init方法中动态传入的域名
filepath_to_uri这用于判断image属性的链接是否为空,不为空则返回原来的值
最后使用urljoin方法拼接域名和链接,返回完整的链接
所以如果需要在连接前添加域名,不需要重新定义Storage的url函数(况且我重新定义了还出错,弄了很久极其郁闷)
只需要在配置文件中加入一行代码即可实现:
MEDIA_URL = 'http://域名:8888/'
壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。
于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”
苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”
客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。