我的问题是,我不能服务我保存的图像,通过我的应用程序的管理界面。或者更确切地说,我可以,但是通过一条迂回的路--我相信这不是正确的方法。这个网站是关于葡萄酒的。有一个管理端,允许用户编写评论,并保存瓶子的图片。这似乎很好,但当我试图在网页上提供该图像时,会出现各种错误。这款应用被称为“火鸡酒”。我用的是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_name2)我有这样的文件结构,并且图像从管理端保存到静态/映像/葡萄酒
├── 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.py3) 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)管理端成功地显示了一个上传按钮。我上传了图像(它出现在静态/图像/葡萄酒文件夹中),它在管理表单上列出如下
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/ 不存在带有主键u'2/static/images/wine/Versus-Syrah-Viognier-2013.png‘的does对象。
注意,URL不是..../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/turkish红酒/红酒/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 }}
显然,我的设置有问题,但我不知道在哪里。任何帮助都非常感谢。
发布于 2014-03-29 18:33:22
ImageField继承自FileField https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield
upload_to参数采用附加到MEDIA_ROOT设置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/图像/葡萄酒中,并且一切都应该正常工作,您应该能够使用这样的方法从模板中访问它们
<img src="{{ individual_wine.wine_image.url }}"/>如果您希望能够从管理列表中看到模型图像,那么请看一看https://github.com/20tab/twentytab-image-ui,它很简单也很有用!
https://stackoverflow.com/questions/22734882
复制相似问题