Как отобразить изображение, созданное в бэкэнд с помощью Django

Я новичок в django, и я путаюсь с проблемой отображения изображения. Теперь у меня есть изображение облака слов, сгенерированное в бэкэнд (скажем, topicWords.py), и я не знаю, как с этим бороться. (1) Как сохранить его в поле изображения модели UserProfile? В models.py у меня есть:

class UserProfile(models.Model):
user = models.OneToOneField(User)
tagcloud = models.ImageField(upload_to ='rap_song/raptle/pic/')

Правильно ли делать следующее:

user.userprofile.tagcloud = wc #wc is the image generated

(2) Какими должны быть настройки MEDIA_ROOT и MEDIA_URL?

(3) Как отобразить его в .html?

Большое спасибо!

3 ответа

MEDIA_URL должен выглядеть следующим образом:

MEDIA_ROOT='(the full path to the media folder)' (i.e: '/home/jason/work/project/media/')
MEDIA_URL='/media/'

И добавьте эти строки в конец вашего файла urls.py:

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Вы можете получить к нему доступ в шаблонах, используя:

Если вы хотите установить путь ImageField в Django вручную, вы можете сохранить файл изображения, а затем установить значение пути при сохранении экземпляра модели. Вы можете сослаться на эту ссылку для получения дополнительной информации об этом.


Django models.ImageField имеет метод save(), унаследованный от FileField, который обычно является тем, который вы хотите использовать при создании изображений на сервере. Этот метод заботится о upload_to, а также работает с другими файловыми хранилищами файлов.

from io import BytesIO
# Or if you use python 2:
# from StringIO import StringIO as BytesIO 
from PIL import Image
from django.core.files.base import ContentFile
wc = Image() # Create the image somehow
filename = 'filename.png' # Make a filename as well
in_memory_file = BytesIO()
wc.save(in_memory_file)
profile_image = ContentFile(in_memory_file.getvalue())
user.userprofile.tagcloud.save(name=filename, content=profile_image, save=False)
user.userprofile.save()

Docs: https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.fields.files.FieldFile.save

FieldFile.save(имя, содержимое, save = True)

Принимает два обязательных аргумента: name, который является именем файла, и content, который является объектом, содержащим содержимое файлов. необязательный аргумент save определяет, является ли экземпляр модели сохраняется после изменения файла, связанного с этим полем. По умолчанию True.

Обратите внимание, что аргумент content должен быть экземпляром django.core.files.File, а не встроенный файловый объект Pythons.


settings.py

MEIDA_URL = '/pic/'
MEDIA_ROOT = os.path.join(REPOSITORY_ROOT, 'pic/')
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(REPOSITORY_ROOT, 'static/')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
)

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf.urls.static import static
urlpatterns = [
......
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += staticfiles_urlpatterns()

models.py

class UserProfile(models.Model):
user = models.OneToOneField(User)
tagcloud = models.ImageField(upload_to ='rapper/')

topicWords.py

d = path.dirname("/rapper/")
wc = WordCloud(background_color="white", max_words=2000, font_path='********-Bold.otf')
# generate word cloud
wc.generate_from_frequencies(word_tag)
# save to the "rapper/", right?
wc.to_file(path.join(d,"rapper1.png"))
userprofile.tagcloud = "rapper/rapper1.png"
userprofile.save()

licensed under cc by-sa 3.0 with attribution.