Как сохранить загруженные файлы в модели и обслуживать их в шаблонах? - PullRequest
0 голосов
/ 30 мая 2018

Я следую официальному руководству по django 2, но меня немного смущает вопрос работы с изображениями и загруженными файлами.

У меня есть проект с несколькими приложениями.Давайте назовем проект myProj и приложение 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

Теперь проблема в том, что при попытке открыть страницу индекса изображение не отображается, потому что URLна это: http://127.0.0.1:8000/myModel/myModel_images/myImage.jpg однако, если я вручную открою URL: http://127.0.0.1:8000/media/myModel_images/myImage.jpg, я вижу правильное изображение.Может кто-нибудь, пожалуйста, помогите мне понять, где проблема и как я могу это исправить?Любые другие отзывы о моем коде также приветствуются.

1 Ответ

0 голосов
/ 30 мая 2018

Что происходит, когда я делаю n.image и почему он дает мне URL, но неверный URL?

Это вовсе не неправильный URL.Это связано с тем, что n.image возвращает URL-адрес изображения, например /path/to/image.jpg, в точности так, как вы настроили его в вашем ImageField upload_to

myImage = models.ImageField(upload_to='myApp_images')

, по умолчанию к нему будет добавляться ваш URL-адрес истановится 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 127.0.0.1:8000

Чтобы исправить это, в своем шаблоне откройте URL-адрес изображения с помощью {{instance.field.url}}

попробуйте:

<img src="{{ n.image.url }}"></img>

вместо

<img src="{{ n.image }}"></img>
...