【问题标题】:Serving an image in Django 1.6在 Django 1.6 中提供图像
【发布时间】:2014-03-29 18:13:39
【问题描述】:

我的问题是我无法通过我的应用程序的管理界面提供我保存的图像。或者更确切地说,我可以,但是通过一个迂回的方式——我确信这不是正确的方式。该网站是关于葡萄酒的。有一个管理端允许用户写评论,并保存瓶子的图片。这似乎效果很好,但是当我尝试在网页上提供该图像时,会出现各种错误。该应用程序称为土耳其酒。我正在使用 Django 1.6。

设置如下:

1) model.py 文件:

from django.db import models

class Wines(models.Model):

    wine_winery = models.ForeignKey(Winery)
    wine_name = models.CharField(max_length=200)
    wine_image = models.ImageField(blank=True, upload_to='static/images/wine/')
    ....

    def __unicode__(self):  # Python 3: def __str__(self):
        return self.wine_name

2) 我有这样的文件结构,并且图像确实从管理端保存到 static/images/wine

├── db.sqlite3
├── manage.py
├── static
│   └── images
│       ├── wine
│       │   ├── bottle_example2.png
│       │   ├── Buzbag-Rezerv-2008.png
│       │   ├── Imperial-Export-2005.png
│       │   └── Versus-Syrah-Viognier-2013.png
├── turkishwine
│   ├── admin.py
│   ├── __init__.py
│   ├── models.py
│   ├── templates
│   │   └── turkishwine
│   │       ├── index.html
│   │       ├── individualwine.html
│   │       └── wines.html
│   ├── tests.py
│   ├── urls.py
│   ├── views.py
└── wilswebsite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── wsgi.py

3) settings.py 文件包括以下内容:

INSTALLED_APPS = (
    ...
    'django.contrib.staticfiles',
    'turkishwine',
)

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
    '/var/www/static/',
)

4) views.py 是这样的:

from django.http import HttpResponse
from django.shortcuts import render
from turkishwine.models import Wines 

def wines(request, id):
    individual_wine = Wines.objects.get(pk=id)
    context = {'individual_wine': individual_wine}
    return render(request, 'turkishwine/individualwine.html', context)
...

5) urls.py 包括:

from django.conf.urls import patterns, url
from turkishwine import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^wines/(?P<id>\d+)/$', views.wines, name='wines'),
  ...
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)


这是问题:

A) 管理员端成功显示了一个上传按钮。我上传了图片(出现在 static/images/wine 文件夹中),它在管理表单中列为

Wine image: Currently: static/images/wine/Versus-Syrah-Viognier-2013.png

但是,当我点击蓝色链接查看图片时,我得到一个 404,上面写着:

请求网址: 127.00.00.1:8000/admin/turkishwine/wines/2/static/images/wine/Versus-Syrah-Viognier-2013.png/

带有主键的 wines 对象 u'2/static/images/wine/Versus-Syrah-Viognier-2013.png' 不存在。

注意网址不是..../static/images/wine/Versus-Syrah-Viognier-2013.png/,而是.../**admin/turkishwine/wines/2/**static/images/wine/Versus-Syrah-Viognier-2013.png/

我可以通过导航到127.00.00.1:8000/static/images/wine/Versus-Syrah-Viognier-2013.png/ 来检索图像。但是,管理端或目录结构似乎有问题,但我不知道是什么。为什么要在 URL 中添加 admin/turkishwine/wines/2/

B) 我可以在模板 (individualwine.html) 中通过返回三个目录来检索图片:

{% load staticfiles %}
<img src= "../../../{{ individual_wine.wine_image }}"/>

但不是https://docs.djangoproject.com/en/1.6/howto/static-files/中列出的方法 这表明:

{% load staticfiles %}
<img src="{% static "{{ individual_wine.wine_image }}" %}"/>

导致 URL:127.00.00.1:8000/static/{{ individual_wine.wine_image }}

我的设置显然有问题,但我不知道在哪里。非常感谢任何帮助。

【问题讨论】:

  • 您是否尝试将您的upload_to='static/images/wine/' 行更改为upload_to='/static/images/wine/'
  • 感谢您的回复!我刚刚尝试过并重新上传了照片。尝试保存更改会导致错误请求 (400) 错误。不过感谢您的建议!
  • 最好将用户(或管理员)上传的图像存储到media 目录而不是static。是否需要将图片存入static
  • 不管怎样,对我来说都很棒!我正在使用docs.djangoproject.com/en/1.6/howto/static-files 网页中建议的静态文件夹。图像确实保存到静态文件夹中,我可以通过一种迂回的方式将它们送达,但我认为管理端的“预览”功能(或其他任何名称)没有问题工作。

标签: python django image static django-1.6


【解决方案1】:

ImageField 继承自 FileField https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield

upload_to 参数采用附加到 MEDIA_ROOT 设置https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.FileField.upload_to的相对路径

做这样的事情

settings.py

import os
....
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_ROOT = os.path.abspath(os.path.join(BASE_DIR, 'media'))
MEDIA_URL = '/media/'

models.py

class Wines(models.Model):
    ...
    wine_image = models.ImageField(blank=True, upload_to='wine')
    ....

它们将被上传到 /media/images/wine 并且一切都应该正常工作,您应该能够通过类似这样的方式从您的模板中访问它们

 <img src="{{ individual_wine.wine_image.url }}"/>

如果您还希望能够从管理员列表中查看模型图像,请查看https://github.com/20tab/twentytab-image-ui,它既简单又实用!

【讨论】:

  • 多里安,你是个摇滚乐手和滚子!非常感谢!
  • 我一定要看看二十个标签!:-)
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多