Django上传图片后无法显示(已解决)

在Ubuntu 16.04环境下,使用Django 1.8.2时遇到图片上传后无法在页面显示的问题。经过排查发现是图片路径错误导致,通过调整views.py、HTML页面和settings.py中的相关路径设置,尤其是去除MEDIA_ROOT中'/',解决了404错误,成功显示上传的图片。
部署运行你感兴趣的模型镜像

——使用Ubuntu16.04,pycharm 专业版,django1.8.2——
我想让图片上传成功后,显示在同一个页面,views.py里的函数代码如下:

   def pic_upload(request):
	   if request.method == 'GET':
	        return render(request, 'booktest/pic_upload.html')
	    if request.method == 'POST':
	        pic = request.FILES.get('pic')   #获取前端上传的图片
	        pic_obj = PicTest()   #图片对象
	        #写法2
	        fname = '%s/booktest/%s' % (settings.MEDIA_ROOT, pic.name)
	        #写法1
	        # fname = f'{settings.MEDIA_ROOT}/booktest/{pic.name}'   #构建文件上传地址
	        f = FileSystemStorage()  #django自带的文件处理类,自动保存上传的图片        
	        path = f.save(fname, pic)   #保存文件并返回文件名,如果文件名存在则创建一个不存在的名字
	        pic_obj.pic = path
	        pic_obj.save()
	        # return HttpResponse('upload successfully')
	        response = redirect('/pic_show/')
	        return response

def pic_show(request):
    imgs = PicTest.objects.all()
    return render(request, 'booktest/pic_upload.html', {'imgs': imgs})

html页面的代码如下:

{% load static from staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>pic_upload&show</title>
</head>
<body>
<!--表单上传-->
 <form action="/pic_upload/" method="post" enctype="multipart/form-data">
     {% csrf_token %}
     <input type="file" name="pic" >
     <br>
     <input type="submit" value="提交" >
 </form>

<br>
<!--显示-->
{% for i in imgs %}
    <img src="{% static 'img/' %} {{ i.pic }}" alt="">
{% endfor %}

</body>
</html>

网页f12查看network如下:
Request URL:http://127.0.0.1:8000/static/media/booktest/home/ann/Desktop/mysqltest/test2/static/media//booktest/liuwen1.jpg
这里让我怀疑是获取图片的路径出错导致图片无法显示
这一段是图片存放的绝对路径: /home/ann/Desktop/mysqltest/test2/static/media//booktest/liuwen1.jpg
在这里插入图片描述
然后我尝试在网页修改了路径,能成功找到我的图片了,虽然网页没有自动同步刷新,网页上仍然不显示图片:
在这里插入图片描述
出现问题如下:
但是Django会一直提示404 报错:
在这里插入图片描述

"GET /static/img/%20/home/ann/Desktop/mysqltest/test2/static/img//booktest/liuwen3_Kwj8wxG.jpg HTTP/1.1" 404 1852

咨询大神,他说可能是Ubuntu的写法不太一样,让我尝试了“写法2”(本来是用写法1)但是也不行
可以正常上传文件,数据库里也是有图片数据在的,工程文件夹的对应位置也能看得到图片,
但是网页上无法显示

在这里插入图片描述

解决方法:
view.py改一下fname = f’booktest/{pic.name}’
html页面也改一下
同时要注意settings.py 里的MEDIA_ROOT的media后面不要加/
(这是因为,加了以后在实际路径显示会重复出现/,就是变成了static/media//booktest)
在这里插入图片描述
在这里插入图片描述成功!

您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

### Django 前端图片无法显示解决方案 在 Django 项目中,如果前端图片无法正常显示,通常是因为静态文件或媒体文件的配置存在问题。以下是详细的分析和解决方案: #### 1. 调试模式下的静态文件服务 当 `DEBUG` 设置为 `True` 时,可以通过 `django.conf.urls.static` 提供静态文件的服务[^1]。例如,在 `urls.py` 文件中可以这样配置: ```python from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 其他路由配置... ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \ + static('/images/', document_root='/path/to/your/images') ``` 上述代码会将 `/images/` 映射到指定的目录下。 #### 2. 生产环境中的静态文件处理 当 `DEBUG=False` 时,Django 再提供静态文件的服务[^4]。此时需要通过其他方式来托管静态文件,比如 Nginx 或者使用 `whitenoise` 插件。另外,还需要确保以下几点被正确配置: - **收集静态文件** 使用命令 `python manage.py collectstatic` 将所有应用中的静态文件复制到 `STATIC_ROOT` 所指向的位置[^2]。 - **URL 和根路径映射** 在生产环境中,可以通过 URL 模式匹配的方式提供静态文件访问支持。例如: ```python from django.conf.urls import url from django.views.static import serve urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}), url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}), ] ``` #### 3. 配置媒体文件 对于用户上传图片或其他媒体资源,需单独配置 `MEDIA_URL` 和 `MEDIA_ROOT`[^3]。例如: ```python # settings.py MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') ``` 同样地,在调试模式下可以直接通过 `django.conf.urls.static` 来提供这些文件;而在生产环境下,则推荐由 Web 服务器(如 Nginx)负责托管。 #### 4. HTML 中引用图片路径 无论是在开发还是生产阶段,都应遵循统一的标准去引用图片地址。假设某张图片位于 `myapp/static/myapp/images/example.jpg` 下面,那么可以在模板里这么写: ```html <img src="{% static 'myapp/images/example.jpg' %}" alt="Example Image"> ``` 这利用了 `{% static ... %}` template tag 自动解析出正确的相对或者绝对 URI。 --- ### 总结 综上所述,要解决 Django 项目中前端图片无法显示的问题,关键是合理设置静态文件与媒体文件的相关参数,并依据当前运行状态调整其分发策略。具体来说就是确认好以下几个方面的工作:一是检查项目的 `settings.py` 是否有正确定义 STATIC/MEDIA 的变量值;二是视情况决定采用何种手段发布这些资料给客户端浏览器获取得到。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值