我的问题是我无法通过应用程序的管理界面提供我保存的图像。或者更确切地说我可以,但是通过一种迂回的方式 - 我确信这不是正确的方式。该网站旨在介绍 Wine 。有一个管理端,允许用户撰写评论并保存瓶子的图片。这似乎运作良好,但是当我尝试在网页上提供该图像时,出现各种错误。该应用程序称为turkishwine。我正在使用 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 错误消息:
Request URL: 127.00.00.1:8000/admin/turkishwine/wines/2/static/images/wine/Versus-Syrah-Viognier-2013.png/
wines object with primary key u'2/static/images/wine/Versus-Syrah-Viognier-2013.png' does not exist.
请注意,URL 不是 ..../static/images/wine/Versus-Syrah-Viognier-2013.png/
,而是 .../**admin/土耳其 Wine / Wine /2/**静态/图像/ Wine /Versus-Syrah-Viognier-2013.png/
我可以通过导航到 127.00.00.1:8000/static/images/wine/Versus-Syrah-Viognier-2013.png/
来检索图像。然而,管理端或目录结构似乎有问题,但我无法弄清楚是什么。为什么它会将 admin/turkishwine/wines/2/ 添加到 URL 中?
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 }}
我的设置显然有问题,但我不知道问题出在哪里。非常感谢任何帮助。
最佳答案
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 的相对路径
做这样的事情
设置.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/'
模型.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 ,简单又有用!
关于python - 在 Django 1.6 中提供图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22734882/