如何将上传的文件保存到模型中并在模板中提供?

时间:2018-05-30 15:11:42

标签: django django-2.0

我一直在关注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我看到了正确的图片。谁能帮助我了解问题所在以及如何解决问题?关于我的代码的任何其他反馈也将非常感激。

1 个答案:

答案 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>