轻编程在最初学习django开发的时候,被上传图片这个问题折磨了很长时间,这份技术总结可以说是我对上传图片不成功、不显示、不更新这类问题血与泪换来的技术经验,今天分享给大家,避免遇到同样的坑。
1、确保安装了pillow图片库,Django图片依赖这个库
pip3 install pillow
2、确保项目settings.py设置了****STATIC_URL****和****MEDIA****文件夹
# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"),]
# media_confige
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
3、确保项目****settings.py****配置项****TEMPLATES****下的****OPTIONS****下的****context_processors****中添加了如下配置,加入这个之后,调用图片路径时可以使用{{ MEDIA_URL }}{{ object.img }}的方式拼接图片路径。
'django.template.context_processors.media',
4、确保项目的urls.py文件中加入了如下配置
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
5. 在模板中使用正确代码显示图片
如果是用户通过django上传的图片, 使用src="{{ MEDIA_URL }}{{ object.img }}"方式显示图片.
如果使用静态文件夹里的图片(非django上传),使用static方式, 如下所示,不过千万别忘了在模板里加入 {% load static %}标签。
6. 确保模板中表单包含了enctype="multipart/form-data"的属性
否则表单无法上传图片或文件。
7. 处理图片上传的视图函数进行表单结合时别忘了加request.FILES。
if request.method == "POST":
pf = PictureForm(request.POST, request.FILES)
8. 确保模型里自定义了****upload_to****选项
img = models.ImageField(upload_to=user_directory_path, verbose_name="avatar")
9. 确保Linux服务器上media文件夹用户有读写的权限。
一般用户上传的图片都在media文件夹,如果权限不对是无法上传的。如果没有权限可使用如下命令查看和更改media夹权限
- ls–la /path/to/media/ # 查看权限
- sudo chown www-data:www-data media #unix默认user和group都是www-data
- sudo chmod 770 media
10. 如果是更新图片实例,别忘了加入instance
如instance=profile, data=request.POST, files=request.FILES.
if request.method == "POST":
opf = PictureForm(instance=profile, data=request.POST, files=request.FILES)