从Django管理页面提供图像文件

7

我正在建立一个网站(顺便说一下,这是我第一次从头开始构建网站,所以对django很陌生),我想要为管理员提供一种方式来部署图片到管理页面,这些图片将用于驱动客户的业务逻辑。然而,我希望管理员也能够从管理页面查看这些图片。

因此,我希望有一个共同的图像文件夹可以从应用程序视图和管理员视图中访问。我目前只有一个名为retailFilters的应用程序。

现在,实际上将一些文件部署到我的media/images文件夹并不是问题,我在管理页面上添加了一个记录(指定要上传的图像),确实,文件正等在我预期的位置。我也意识到我必须告诉django从哪里提供它们,在互联网上搜寻后,我已经定义了我的MEDIA_ROOT、MEDIA_URL和urlpatterns:

settings.py

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

(并且 INSTALLED_APPS 包括 django.contrib.staticfiles))

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

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

然而,点击它们的响应是管理员会遇到以下错误提示:

"ID为“1/change/media/images/2012-03-29”.27.05.jpg” 的过滤器不存在。可能已被删除?"


我的Python版本是2.7.10。

我的Django版本是1.11。

目前我的目录结构(根目录为项目目录)如下:

.
├── db.sqlite3
├── manage.py
├── media
│   └── images
│       └── 2012-03-29_22.27.05.jpg
├── NOTES
├── retailFilters
│   ├── admin.py
│   ├── admin.pyc
│   ├── apps.py
│   ├── fixtures
│   │   └── boltons.json
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0001_initial.pyc
│   │   ├── 0002_auto_20170816_1934.py
│   │   ├── 0002_auto_20170816_1934.pyc
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── tables
│   │   ├── Bolt_On_Group.py
│   │   ├── Bolt_On_Group.pyc
│   │   ├── Bolt_On.py
│   │   ├── Bolt_On.pyc
│   │   ├── Filter.py
│   │   ├── Filter.pyc
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── Order_Payment.py
│   │   ├── Order_Payment.pyc
│   │   ├── Order.py
│   │   ├── Order.pyc
│   │   ├── Payment_Vendor.py
│   │   ├── Payment_Vendor.pyc
│   │   ├── User.py
│   │   └── User.pyc
│   ├── tests.py
│   └── views.py
├── snapify
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
└── static
    └── retailFilters
        └── media
            └── images

我的admin.py文件中有:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin

from django.contrib.auth.models import User
from django.contrib.auth.models import Group

from tables.Filter import Filter

admin.site.unregister(User)
admin.site.unregister(Group)

<...other un-related admin entries ...>    

@admin.register(Filter)
class FILTER_Admin(admin.ModelAdmin) :
    fields = ('DESCRIPTION', 'FILENAME', 'CATEGORY', 'PRICE')

    #list_display = ('show_image',)

我的模型筛选器如下:
筛选器.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
from django.core.exceptions import ValidationError
from django.core.files.storage import FileSystemStorage

import os
import pdb

categories = {'T': 'Personalised Template', 
              'C': 'Custom Filter'}
images = 'images'

class Filter(models.Model) :
    FILTER_REFERENCE   = models.IntegerField(primary_key = True)
    FILENAME           = models.ImageField(upload_to = images)
    DESCRIPTION        = models.TextField()
    CATEGORY           = models.CharField(max_length = 1, null = True, choices = [(x, categories[x]) for x in categories])
    PRICE              = models.DecimalField(default = 0.00, max_digits = 5, decimal_places = 2)

    def __unicode__(self) :
        return self.DESCRIPTION

    #def show_image(self) :
    #    #pdb.set_trace()
    #    return '<a href="{0}"><img src="{0}"></a>'.format(self.FILENAME)

    #show_image.allow_tags = True

运行服务器命令的最后输出:

System check identified no issues (0 silenced).
August 16, 2017 - 20:03:42
Django version 1.11.1, using settings 'snapify.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[16/Aug/2017 20:03:44] "GET /admin/ HTTP/1.1" 200 4683
[16/Aug/2017 20:03:47] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 4203
[16/Aug/2017 20:03:47] "GET /admin/jsi18n/ HTTP/1.1" 200 3217
[16/Aug/2017 20:03:55] "POST /admin/retailFilters/filter/ HTTP/1.1" 200 3175
[16/Aug/2017 20:03:57] "POST /admin/retailFilters/filter/ HTTP/1.1" 302 0
[16/Aug/2017 20:03:57] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 3189
[16/Aug/2017 20:03:58] "GET /admin/jsi18n/ HTTP/1.1" 200 3217
[16/Aug/2017 20:04:04] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 3067
[16/Aug/2017 20:04:06] "GET /admin/retailFilters/ HTTP/1.1" 200 3167
[16/Aug/2017 20:04:08] "GET /admin/retailFilters/filter/add/ HTTP/1.1" 200 5420
[16/Aug/2017 20:04:08] "GET /admin/jsi18n/ HTTP/1.1" 200 3217
[16/Aug/2017 20:04:20] "POST /admin/retailFilters/filter/add/ HTTP/1.1" 302 0
[16/Aug/2017 20:04:20] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 4391
[16/Aug/2017 20:04:20] "GET /admin/jsi18n/ HTTP/1.1" 200 3217
[16/Aug/2017 20:04:23] "GET /admin/retailFilters/filter/1/change/ HTTP/1.1" 200 5789
[16/Aug/2017 20:04:23] "GET /admin/jsi18n/ HTTP/1.1" 200 3217
[16/Aug/2017 20:04:25] "GET /admin/retailFilters/filter/1/change/media/images/2012-03-29_22.27.05.jpg/ HTTP/1.1" 302 0
[16/Aug/2017 20:04:25] "GET /admin/retailFilters/filter/1/change/media/images/2012-03-29_22.27.05.jpg/change/ HTTP/1.1" 302 0
[16/Aug/2017 20:04:25] "GET /admin/ HTTP/1.1" 200 5427
[16/Aug/2017 20:04:29] "GET /admin/retailFilters/filter/1/change/ HTTP/1.1" 200 5789

非常抱歉,如果这个问题被问了无数次,但是我已经花了整整5个小时在互联网上搜寻这个问题,但仍然没有成功。

有没有人能指出我缺少什么?

1个回答

15

你只需要修改settings.py文件:

MEDIA_ROOT = os.path.join(parent_dir, 'media/')
MEDIA_URL = '/media/'
#------------^

1
非常感谢您发现了那个问题...真的有效! - HexedAgain
5
同时,需要确保它也在urls.py中设置。 - Anupam
在Windows操作系统上,os.path.join无法正常工作。我使用的是MEDIA_ROOT += 'media/'。 - Emmanuel Chamilakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接