【问题标题】:Images not showing up in Django template when using Windows使用 Windows 时,图像未显示在 Django 模板中
【发布时间】:2015-06-11 01:36:16
【问题描述】:

我正在通过开发博客来学习 Django。我的代码在 Linux 和 Windows 上都可以运行。最近,我开始使用 ImageField 将图像添加到我的模型中,它可以在 Linux 中运行,但我无法让它在 Windows 中运行。我正在使用独立服务器。 这是我的 settings.py 文件:

    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 和 STATIC 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 的吗?我将 Django 1.7 与 Python 2.7.3 一起使用。

提前致谢。

******************编辑********* 我的目录结构是:

    C:
        django
            thrid_blog
                zblog
                    blog
                    media_files
                    static
                    zblog
                    manage.py

我的 settings.py 文件在最后一个 zblog 目录中。所以,我说:

    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 指向项目的主目录,其中包含目录 blog、media_files、static、zblog。但是还是不行。

此外,即使我将图像硬编码到 HTML 中:

    <img src = "C:\django\third_blog\zblog\media_files\blog\IMG_20141125_104718.jpg" height=100> </br>

它仍然没有显示图像。它给了我一个空格。

【问题讨论】:

  • 您的 MEDIA_URL 应该只是 '/media/',就像您的 STATIC_URL 只是 '/static/'
  • 谢谢!那是错误。

标签: python django windows imagefield


【解决方案1】:

你想使用来自

的路径

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。再次感谢您的帮助。
  • 它们是显示使用 os.path BASE_DIR 来设置你的示例的示例。我想你知道相应地更新名称。
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多