报错:
WARNING 2022-02-19 09:18:17,492 basehttp 124 “GET /list/115/1/%7B%7B%20no%20such%20element:%20str%20object[‘url’]%20%7D%7D HTTP/1.1” 404 4530
WARNING 2022-02-19 09:18:17,497 basehttp 124 “GET /hot/115/ HTTP/1.1” 404 4353
INFO 2022-02-19 09:18:35,319 basehttp 124 “GET /list/115/1/?sort=price HTTP/1.1” 200 88068
WARNING 2022-02-19 09:18:35,359 base 152 Not Found: /list/115/1/{{ no such element: str object[‘url’] }}
html:
models:
因为views代码没问题,就不放了。
分析:
报错的大概意思是{{ sku.default_image.url }}里的sku.default_image没有url属性,但是我在前面的index.html中使用content.image.url却没有问题,这里的content和sku都是模型类,一个这么用没问题,一个却有问题,那么原因可能是这两个模型类的image定义字段有差别。
content:image = models.ImageField(null=True, blank=True, verbose_name=‘图片’)
sku:default_image=models.CharField(max_length=50, default=’’,null=True, blank=True, verbose_name=‘默认图片’)
看出区别了吗?
sku图片的创建使用的CharField,这个CharField导致我重写的class FastDFSStorage(Storage)(代码放在最后)压根用不上了,因为这个类是为了给ImageField用才重写的。
解决方法:
所以解决方法是:将default_image=models.CharField(max_length=50, default=’’,null=True, blank=True, verbose_name=‘默认图片’)
改为
default_image = models.ImageField(null=True, blank=True, verbose_name=‘默认图片’)
然后重新创建migrations文件并做迁移。
附FastDFSStorage代码
from django.conf import settings
from django.core.files.storage import Storage
class FastDFSStorage(Storage):
"""自定义文件存储系统,修改存储的方案"""
def __init__(self, fdfs_base_url=None):
"""
构造方法,可以不带参数,也可以携带参数
:param base_url: Storage的IP
"""
self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL
def _open(self, name, mode='rb'):
pass
def _save(self, name, content):
pass
def url(self, name):
"""
返回name所指文件的绝对URL
:param name: 要读取文件的引用:group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
:return: http://192.168.103.158:8888/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
"""
# return 'http://image.meiduo.site:8888/' + name
return self.fdfs_base_url + name