使用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> 

它仍然不显示图像。它给了我一个空白空间。

+0

您的MEDIA_URL应该只是'/ media /',就像您的STATIC_URL只是'/ static /' –

+0

谢谢!那是错误。 –

您要使用的路径从

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将它们正确连接起来。

+0

仍然无法正常工作。我在我的问题中将这些更改作为编辑。 –

+0

根本不需要修改manage.py。在您的模板中,您需要在顶部附近使用{%load staticfiles%},获取图片的格式为{%static} blog \ IMG_20141125_104718.jpg“%}' –

+0

谢谢。是的,我不必更改manage.py。您为settings.py发布的更改很方便。但MEDIA_ROOT必须指向os.path.join(BASE_DIR,'media_files'),而MEDIA_URL必须是'/ media /'。主要的错误是使用MEDIA_URL。再次感谢你的帮助。 –