使用Windows时,图像没有显示在Django模板中
我正在通过开发博客学习Django。我的代码可以在Linux和Windows上运行。最近,我开始使用ImageField将图像添加到我的模型中,它在Linux中工作,但无法在Windows中使用它。我正在使用独立服务器。 这里是我的settings.py文件:使用Windows时,图像没有显示在Django模板中
MEDIA_ROOT = 'C:/django/third_blog/zblog/media_files/'
MEDIA_URL = 'C:/django/third_blog/zblog/media_files/'
STATIC_ROOT = 'C:/django/third_blog/zblog/static'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'C:/django/third_blog/zblog/media_files/',
)
TEMPLATE_DIRS = (
'C:/django/third_blog/zblog/templates',
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
'blog',
)
我与MEDIA_ROOT,MEDIA_URL,STATIC_ROOT和静态URL拨弄各地去的代码在Linux下工作。我用pip在windows中安装了pillow-2.8.1。
这是在模板目录我的html文件:
{% load staticfiles %}
<a href = "/">Back to homepage </a>
{% if list_of_blog_entries %}
<ol>
{% for blog_entry in list_of_blog_entries %}
<li> {% for blog_item in blog_entry %}
{% if blog_item.image %}
<img src = "{{ blog.item.url }}" height=100> </br>
{% endif %}
{% endfor %} </li> </br> </br>
{% endfor %}
</ol>
{% else %}
<p> Blog is empty </p>
{% endif %}
这是我的views.py文件:
# other imports
import zblog.settings as settings_file
#from PIL import *
import PIL
def list_posts(request):
"""
Lists the posts with their contents on a single page.
"""
###
# I stands for image or photo.
if post_item == "I":
items_in_post.append(post.postimage_set.get(image_id=post_item_id))
try_image=post.postimage_set.get(image_id=post_item_id)
print try_image.image.url
print settings_file.MEDIA_ROOT+try_image.image.url
print try_image.image
print
print
image_counter += 1
list_of_blog_entries.append(items_in_post)
return render_to_response("blog/list_posts.html", \
{'list_of_blog_entries' : list_of_blog_entries, \
'image_root':settings_file.MEDIA_URL})
我有很多其他的代码,我还没有公布。我有上传图片的表单。该映像已成功上传,可在子目录media_file/blog中找到。当我尝试列出图像时,它会显示图像的断开链接。所以我用views.py中的“print try_image.image.url”打印出url,发现这个url是关于主目录“blog/IMG.jpg”的。因此,我添加了MEDIA_ROOT并发现我现在获得完整的目录路径“C:/django/third_blog/zblog/media_files/blog/IMG.jpg”。
我传递的变量MEDIA_ROOT到模板,改变了模板
<img src = "{{ image_root }}{{ blog.item.url }}">
现在,我得到了一个空白空间,图像应该是。花了过去一小时的搜索结果,找到了我第一次使用Linux的链接。有什么特定于Windows的?我在Python 2.7.3中使用Django 1.7。
在此先感谢。
*************编辑********* 我的目录结构是:
C:
django
thrid_blog
zblog
blog
media_files
static
zblog
manage.py
我在过去的ZBLOG目录settings.py文件。于是,我把:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
在我的manage.py文件,并在我的settings.py文件,我把
import sys
sys.path.append("c:\django\third_blog\zblog")
from manage import BASE_DIR
得到BASE_DIR指向该项目的主目录中包含的目录博客,media_files,静态,zblog。但它仍然不起作用。
而且,即使当我硬编码图像到HTML:
<img src = "C:\django\third_blog\zblog\media_files\blog\IMG_20141125_104718.jpg" height=100> </br>
它仍然不显示图像。它给了我一个空白空间。
您要使用的路径从
BASE_DIR = os.path.dirname(os.path.dirname(文件))
打造为文件的路径。 即
# in settings.py
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
)
STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static', 'static_dirs'),
)
MEDIA_ROOT = os.path.join(BASE_DIR, 'static', 'media'),
MEDIA_URL = '/media/'
.join将它们正确连接起来。
仍然无法正常工作。我在我的问题中将这些更改作为编辑。 –
根本不需要修改manage.py。在您的模板中,您需要在顶部附近使用{%load staticfiles%},获取图片的格式为{%static} blog \ IMG_20141125_104718.jpg“%}' –
谢谢。是的,我不必更改manage.py。您为settings.py发布的更改很方便。但MEDIA_ROOT必须指向os.path.join(BASE_DIR,'media_files'),而MEDIA_URL必须是'/ media /'。主要的错误是使用MEDIA_URL。再次感谢你的帮助。 –
您的MEDIA_URL应该只是'/ media /',就像您的STATIC_URL只是'/ static /' –
谢谢!那是错误。 –