如何使用Django显示在后端生成的图像

时间:2015-11-22 16:19:59

标签: python django python-3.x web python-imaging-library

我是django的新手,我对图像显示问题感到困惑。 现在我有一个在后端生成的文字云的图像(让我们说主题词.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中显示它?

<img src = "???">

非常感谢!

3 个答案:

答案 0 :(得分:0)

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)

您可以使用以下方式在模板中访问它:

<img src = "{{ user.userprofile.tagcloud.url }}">

如果要手动在Django中设置ImageField路径,则可以保存图像文件,然后在保存模型实例时设置路径值。您可以参考此link获取更多信息。

答案 1 :(得分:0)

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='WeibeiSC-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()

答案 2 :(得分:0)

Django的models.ImageFieldsave()方法继承自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()

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

  

FieldFile.save(name,content,save = True)

     

需要两个必需的参数:name这是文件的名称,以及   content这是一个包含文件内容的对象。该   可选的save参数控制模型实例是否为   在与此字段关联的文件被更改后保存。   默认为True

     

请注意,content参数应该是一个实例   django.core.files.File,而不是Python的内置文件对象。