我一直在关注django 2官方教程,但我对如何使用图像和上传文件感到困惑。
我有一个包含几个应用的项目。让我们调用项目myProj和app myApp。 myApp中有一个名为myModel的模型,它有一个图像字段myImage。 这是我的模特:
from django.db import models
class myModel(models.Model):
myImage = models.ImageField(upload_to='myApp_images')
以下是我的模板:
<img src="{{ n.image }}"></img>
以下是我的观点
from django.shortcuts import get_object_or_404, render
from .models import myModel
def index(request):
n = myModel.objects[0]
context = {
'n': n,
}
return render(request, 'myModel/index.html', context)
以下是我的设置:(我认为相关的部分)
INSTALLED_APPS = [
'news.apps.myModelConfig',
'django.contrib.staticfiles',
]
MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/aran/myfiles/projects/futureCoin/media/'
这是我的myProject / urls.py:
from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('myModel/', include('myModel.urls')),
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
所以我通过django管理站点制作了一个模型实例。 之后的目录树(我删除了pycache):
.
├── myProject
│ ├── __init__.py
│ ├── models.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── media
│ └── myModel_images
│ └── myImage.jpeg
├── myModel
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── __init__.py
│ ├── models.py
│ ├── static
│ │ └── myModel
│ │ ├── images
│ │ │ └── bg.jpg
│ │ └── style.css
│ ├── templates
│ │ └── myModel
│ │ └── index.html
│ ├── tests.py
│ ├── urls.py
│ └── views.py
现在的问题是,当我尝试打开索引页面时,图片未显示,因为它的网址是:http://127.0.0.1:8000/myModel/myModel_images/myImage.jpg
但如果我手动打开网址:http://127.0.0.1:8000/media/myModel_images/myImage.jpg
我看到了正确的图片。谁能帮助我了解问题所在以及如何解决问题?关于我的代码的任何其他反馈也将非常感激。
答案 0 :(得分:1)
当我执行n.image
时会发生什么?为什么它会给我一个网址但错误的网址?
根本不是一个错误的网址。这是因为n.image
完全按照您在ImageField中设置的方式/path/to/image.jpg
返回图像的网址路径upload_to
myImage = models.ImageField(upload_to='myApp_images')
默认情况下,这将以您的网址地址为前缀,并变为127.0.0.1:8000/path/to/image.jpg
。正如您所看到的那样,它错过了/media/
中提供的settings.MEDIA_URL
,其中所有图片都已本地化。
现在,通过使用{{ n.image.url}}
,您实际上是通过设置配置调用它,MEDIA_URL
/media/
将被添加为前缀,并成为/media/path/to/image.jpg
,前缀为url { {1}}
要修复此问题,请在模板中使用127.0.0.1:8000
尝试:
{{instance.field.url}}
而不是
<img src="{{ n.image.url }}"></img>