Django ImageField не будет отображаться на веб-странице - PullRequest
0 голосов
/ 22 сентября 2018

Я использую imageField в моей модели Django, и фотография не распознается, когда я пытаюсь отобразить ее в html.

Вот мои модели.py

from django.db import models

class LatestRelease(models.Model):
    title = models.CharField(max_length=50)
    description = models.CharField(max_length=300)
    cover = models.ImageField(upload_to='personal/static/img/')
    display = models.BooleanField(default=True)

Вот view.py

from django.shortcuts import render
from personal.models import LatestRelease

def index(request):
    releases = LatestRelease.objects.all()
    return render(request, "personal/home.html", {'releases': releases})

HTML code

 {% for release in releases %}
    <img src="{{ release.cover.url }}" class='' height='235' width='235'>
 {% endfor %}

Таким образом, путь к изображению {{ release.cover.url }} равен /personal/static/img/[image name], и мои фотографии отображаются только при использованииURL-путь /static/img/[image name] в качестве источника.

В любом случае можно ли извлечь /personal из строки, созданной из {{ release.cover.url }}?Или сделать так, чтобы мой источник img принимал файлы под /personal/static/img/[image name]?

1 Ответ

0 голосов
/ 22 сентября 2018

Это может помочь, если вы также показали свои файлы settings.py и urls.py, но я предполагаю, что ваш сервер разработки не настроен для обслуживания этого файла personal/static/img/[image name].Чтобы настроить это, вам нужно настроить файлы settings.py и urls.py основного проекта.

settings.py:

# Add these
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

MEDIA_ROOT указывает, гдефайлы могут быть обработаны с момента нажатия MEDIA_URL (например, когда ваш браузер запрашивает эту картинку).Чтобы на самом деле обслуживать файлы, необходимые для настройки представления, есть встроенная вспомогательная функция для обслуживания этих файлов в процессе разработки, добавьте ее в свой основной файл проекта urls.py

urls.py:

from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    # your other views
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Затем вам нужно просто загрузить изображение еще раз, оно будет сохранено в media/<upload_to>/<picturename>, в вашем случае media/personal/static/img/<picture_name>.И ваш сервер на самом деле будет знать, где его найти сейчас.

Посмотрите документацию , чтобы найти лучший пример.

PS

ЖесткийКодированный URL, который вы использовали, /static/img/[image name] работал, потому что сервер разработки Django может по умолчанию обслуживать статические файлы из каталога static/ в корневом каталоге проекта, а также из любых папок static/ в корневых каталогах приложения.Так что это было какое-то счастливое совпадение, что ваш аргумент upload_to в вашем ImageField создал эту папку /personal/static/.Затем, поскольку в settings.py был установлен DEBUG = True, вы настроили его автоматическое обслуживание.Это описано (лучше) в связанной документации выше.

...