我是用Django开发,想把从图片上传到数据库然后显示到前端界面。在显示的时候出现了路径错误。
html代码如下:
<div id="dis_pic" class="col-md-9">
<div class="row">
<div class="col-md-12">
{% if form.instance.image %}
<img style="width: 500px;height: 280px" src="{{ form.instance.image.url }}" alt="上传的图片">
{% else %}
<p>No image found.p>
{% endif %}
div>
div>
div>
<div id="b_submit" class="col-md-9">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="上传">
form>
div>
我的models.py代码和forms.py代码设置的是:
class UploadImageForm(models.Model):
title = models.CharField(max_length=50, verbose_name='输入图片备注') # 存储图片标题
image = models.ImageField(upload_to="image", verbose_name='图片')
def __str__(self):
return self.title
class ImageUploadForm(forms.ModelForm):
class Meta:
model = UploadImageForm
fields = ('title', 'image',)
def __init__(self, *args, **kwargs):
# 调用父类的 __init__ 方法
super().__init__(*args, **kwargs)
# 获取 image 字段的 widget 对象,并将其样式设置为 display: inline-block
self.fields['image'].widget.attrs.update({
'style': 'display: inline-block;'
})
我在views.py里进行了保存图片并传到前端:
def upload_image(request):
if request.method == 'POST':
form = ImageUploadForm(request.POST, request.FILES) # 如果是POST请求,将请求的数据绑定到表单对象中
if form.is_valid(): # 如果表单数据有效
form.save() # 保存上传的图片到数据库中
print(form.instance.image.url)
return render(request, 'upload_image.html', {'form': form})# 返回页面并显示上传的图片
else:
# 如果请求方法不是POST,创建一个空白的表单对象
form = ImageUploadForm()
return render(request, 'upload_image.html', {'form': form})
我的setting设置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static', 'image')
为什么在这里form.save() 给我保存的路径是/media/image/9.jpg。而且前端src="{{ form.instance.image.url }}"接受的路径也是src="/media/image/9.jpg"
但是图片确实保存在了static下面:
统一下配置:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static')
不知道你这个问题是否已经解决, 如果还没有解决的话:问题分析:
根据代码和问题描述,我们可以知道原因是图片的路径不正确,应该是缺少media前缀。需要在HTML代码中添加media前缀。
解决方案:
在HTML代码中添加MEDIA_URL前缀即可。修改img标签代码如下:
<img src="{{ MEDIA_URL }}{{ image.image }}" alt="{{ image.title }}">
这样就能够在前端显示正确的图片路径,即/media/images/9.jpg。
完整的HTML代码如下:
{% for image in images %}
<div>
<h3>{{ image.title }}</h3>
<img src="{{ MEDIA_URL }}{{ image.image }}" alt="{{ image.title }}">
</div>
{% endfor %}