本文是小编我多年用Django开发Web APP血与泪的教训,定能帮你解决Django项目中上传图片不成功,不能显示或不能更新的问题。9项检查成为你防身避免入坑必备技能。
1. 首先确保使用pip安装了python的图片库pillow
这是最基本的需求。
2. 确保模板中表单包含了enctype="multipart/form-data"的属性
否则表单无法上传图片或文件。
3. 处理图片上传的视图函数进行表单结合时别忘了加request.FILES。
if request.method == "POST":
pf = PictureForm(request.POST, request.FILES)
4. 确保模型里自定义了upload_to选项
avatar = models.ImageField(upload_to=user_directory_path, verbose_name="avatar")
5. 确保项目settings.py设置了STATIC_URL和MEDIA文件夹
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# Media files
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
6. 确保项目urls.py在development阶段使用本地static服务器serve静态文件(包括图片)
# added to show static files
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
]
if settings.DEBUG:
urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns = urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
7. 在模板中使用正确代码显示图片
如果是用户通过django上传的图片, 使用src="object.avatar.url"方式显示图片.
如果使用静态文件夹里的图片(非django上传),使用static方式, 如下所示,不过千万别忘了在模板里加入 {% load static %}标签。
8. 确保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
9. 如果是更新图片实例,别忘了加入instance
如instance=profile, data=request.POST, files=request.FILES.
if request.method == "POST":
opf = PictureForm(instance=profile, data=request.POST, files=request.FILES)
希望本文对大家有所帮助,提前祝大家圣诞快乐。
大江狗
2019.12.23