显示图像Django

时间:2014-04-14 02:31:43

标签: python django

我无法让Django抓住我的静态文件

相关模型:

    class Poll(models.Model):
        question = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published', auto_now_add=True)
        image = models.FileField(upload_to='static/')

        def __unicode__(self):
            return self.question

        def was_published_recently(self):
            return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
        was_published_recently.admin_order_field = 'pub_date'
        was_published_recently.boolean = True
        was_published_recently.short_description = 'Published Recently?'

settings.py:

STATIC_ROOT = '/Users/austinbailey/ENV/mysite/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'media'),
]

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

模板标签:

<img src="{{ poll.image }}" alt="img">

与inspect元素一起显示的内容:

<img src="media/android_pumpkins_fall_1.jpg" alt="img">

这实际上是文件的正确路径,但由于某种原因,它只显示损坏的图像文件。我一直在研究这个问题,我很难过。提前谢谢!

------------------更新-------------------

自从我自己解决问题的初始帖子以来,我已经搞乱了settings.py中的结构和设置,但这是现在的结构。

项目结构:

-mysite (root)
  -mysite
    __init__.py
    settings.py
    urls.py
    wsgi.py
  -polls (app)
    __init__.py
    urls.py
    models.py
    views.py
    forms.py
    admin.py
    -templates (html for admin site)
    -migrations
  -templates
    -admin
      base_site.html
  -static
    -media
      android_computer_back.jpg
      -2014
        -04
          -13
            android_rose.jpg
          -14
            android_computer_android_studio.jpg
    -static
    -static-only
      -admin ( base stuff for admin site )
        -css
        -js
        -img
  manage.py
  db.sqlite3

来自settings.py的相关设置:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATIC_ROOT = os.path.join(os.path.join(BASE_DIR), 'static', 'static-only')
STATIC_URL = '/static/'
MEDIA_URL = 'static/media/'
MEDIA_ROOT = os.path.join(os.path.join(BASE_DIR), 'static', 'media')
STATICFILES_DIRS = (
    os.path.join(os.path.join(BASE_DIR), 'static', 'static'),
)
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

更新型号:

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published', auto_now_add=True)
    image = models.ImageField(upload_to='%Y/%m/%d/')

最新图片标记:

<img src="{{ poll.image.url }}" alt="img" />

显示:

<img src="static/media/2014/04/14/android_computer_android_studio.jpg" alt="img" />

数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

3 个答案:

答案 0 :(得分:0)

您的设置发生了什么变化?他们应该是这样的:

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static-only')
STATIC_URL = '/static'
MEDIA_URL = '/static/media'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static', 'media')
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static', 'static'),
)
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

无需在所有内容上调用os次函数。

答案 1 :(得分:0)

好。请使用以下设置:

STATIC_URL = '/static/'
STATIC_ROOT = 'staticfiles'

MEDIA_ROOT = ''
MEDIA_URL = '/media/'

并在模板中调用图像字段名称,如下所示:

<img src="{{ model_name.img_field_name.url }}" alt="I will work" />

我上面给出的内容会让您在本地工作时看到用户上传的文件。你是否应该尝试在云中部署,如Heroku,收集静态和bla bla bla事件将自动为你完成。

Lemme知道它是否有效。它只是我当前项目中的一个精确片段。

所以,一个例子就是这样:

<img src="{{ category.photo.url }}" alt="I will work" />

答案 2 :(得分:0)

好的,所以我弄清楚问题是什么,当然结果是一个非常笨拙的错误。

我把我的urlpatterns用于媒体和静态文件放在错误的位置。

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

它们位于应用程序的urls.py下,而不是项目的urls.py,其中包含媒体和静态文件的实际文件夹。随着这一变化,图像正在显示,现在一切都很好。

感谢所有帮助