如题:在做更新头像功能的时候,我遇到了一个问题,就是在model里面
logo = models.ImageField(upload_to='logo')
定义了在media路径下,新建一个logo文件夹,上传的文件都存放在logo下面,数据库记录logo/img.jpg
但是在更新头像的时候发现,更换的头像不再以“logo/XXX.jpg”形式记录,而是以“XXX.jpg”方式记录,导致前端路径错误无法显示头像。
--------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------
也就是说,图片在上传操作过程(create)中,会触发ImageField的upload_to='logo',并记录相应的路径,但是在更换操作(update)中,并不触发,导致数据库只存了图片的文件名。
查阅了大量的文章都没有找到原因。。。(话说Django的资料比起spring真是少的可怜-_-||)
但是条条大路通罗马,既然更新的操作导致数据库只记录图片文件名,这一步骤无法改变,那我在一开始上传图片的步骤就只记录文件名,create和update统一,使得前端路径是一致的就OK了。
------------------------------------------------------------------------------------------------------------------------------
APP中的models.py
from django.db import models
class User(models.Model):
# 用户表实例
id = models.AutoField(verbose_name='id',primary_key=True)
userCode = models.CharField(max_length=30,verbose_name='用户账号')
userPassword = models.CharField(max_length=30,verbose_name='用户密码')
logo = models.ImageField(upload_to='') # 设置upload_to为空,数据库的图片路径以“XXX.jpg”形式记录
userName = models.CharField(max_length=30,verbose_name='用户名称')
role = models.CharField(max_length=10,verbose_name='用户角色')
createTime = models.CharField(max_length=30,verbose_name='创建时间')
def __unicode__(self):
return u'User:%s'%self.id
class Meta():
# 实体连接user表
db_table = 'user'
在文件中修改logo = models.ImageField(upload_to=''),使得上传图片的时候upload_to='',这样的话,数据库记录的图片路径以“XXX.jpg”形式记录,后面更新图片的时候也是如此,显示就没问题了。
但是这样有一个问题:如果我就是想存在logo文件下面怎么办?我目前想到的办法是在settings.py设置media路径后面加,例如:
MEDIA_ROOT=os.path.join(BASE_DIR,'media/logo/').replace("\\", "/") # 指定上传文件目录
MEDIA_URL = 'media/logo/' # 读取上传文件目录
# 这里好像不能是 MEDIA_URL = '/media/logo/' ,会报错,原因未知。
即使最终能实现我的需求,但是还有一种情况:动态地创建存放图片存放的文件夹,例如用户的头像要存放在自己的文件夹下,而不是统一个文件夹,就需要在创建的时候动态获取用户名并创建存放的路径。“用户1/用户1.jpg”,“用户2/用户2.jpg”。
目前还是小白一个,如有建议请在评论区多多指教。