今天在做上传头像功能遇到问题,使用ImageField定义了数据库中的列,在views中用了对应的方法也把数据存到库中,但在自定义的media文件夹中却没有自动下载,导致前端的media请求链接404拿不到。
先回顾一下django中的用户上传操作步骤:
setting中:
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
models中:
avatar = models.ImageField(upload_to='avatar', null=True)
urls中:
from django.conf.urls.static import static
urlpatterns+=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
一般的views方法(创建数据时):
Content.objects.create(title=name,picture=file,avatar=file)
之后就是在views中的方法调用,在后面错误中单独写
先看错误的代码
user=UserProfile.objects.filter(username=username)
if len(user)!=0:
avatar=request.FILES['avatar']
user.update(avatar=avatar)
解析:我喜欢用filter拿query对象去进行orm操作,这里的代码跑起来是能把前端put的数据存到库中,但是不会在项目自定义的media中生产对应的图片。
正确的方法(用get操作orm)
try:
user=UserProfile.objects.get(username=username)
except Exception as e:
result = {'code': 10105, 'error': 'no exist this user'}
return JsonResponse(result)
avatar=request.FILES['avatar']
user.avatar=avatar
user.save()
必须要用get拿出对应的一行数据(最后用try进行get操作,不然拿不到数据直接报错),再通过.属性的方法去修改数据,最后用.save()保存,这样才能在修改数据的同时把图片保存在本地指定的media链接。
不知道为什么filter的修改不能保存图片或者文件到本地media,有知道的大佬欢迎指导。