飞道的博客

Django上传图片不成功,不能显示或不能更新问题汇总及解决方案集锦

507人阅读  评论(0)

本文是小编我多年用Django开发Web APP血与泪的教训,定能帮你解决Django项目中上传图片不成功,不能显示或不能更新的问题。9项检查成为你防身避免入坑必备技能。

1. 首先确保使用pip安装了python的图片库pillow

这是最基本的需求。

2.  确保模板中表单包含了enctype="multipart/form-data"的属性

否则表单无法上传图片或文件。

<form method="post" action="" enctype="multipart/form-data">

3. 处理图片上传的视图函数进行表单结合时别忘了加request.FILES。


   
  1. if request.method == "POST":
  2. 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文件夹


   
  1. # Static files (CSS, JavaScript, Images)
  2. # https://docs.djangoproject.com/en/3.0/howto/static-files/
  3. STATIC_URL = '/static/'
  4. STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  5. # Media files
  6. MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  7. MEDIA_URL = '/media/'

6. 确保项目urls.py在development阶段使用本地static服务器serve静态文件(包括图片)


   
  1. # added to show static files
  2. from django.conf import settings
  3. from django.conf.urls. static import static
  4. urlpatterns = [
  5. path( 'admin/', admin.site.urls),
  6. ]
  7. if settings.DEBUG:
  8. urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  9. urlpatterns = urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

7. 在模板中使用正确代码显示图片

如果是用户通过django上传的图片,  使用src="object.avatar.url"方式显示图片.

<img class="img-responsive" src="{{ object.avatar.url }}">

如果使用静态文件夹里的图片(非django上传),使用static方式, 如下所示,不过千万别忘了在模板里加入 {% load static %}标签。

<img src=" {% static '/users/images/default.jpg' %}" alt="{{ user.username }}">

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.


   
  1. if request.method == "POST":
  2. opf = PictureForm(instance=profile, data=request.POST, files=request.FILES)

希望本文对大家有所帮助,提前祝大家圣诞快乐。

大江狗

2019.12.23


转载:https://blog.csdn.net/weixin_42134789/article/details/103676162
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场