如何使用models.ImageField和属性将图像上传到自定义位置?

时间:2016-12-23 14:27:05

标签: django django-models

我是Django的绝对初学者,所以这是我的问题:

  • 我创建了一个模型,我有image = models.ImageField()。当我使用管理界面时,每个上传的图像都放在根目录中。

  • 我仔细阅读了此https://docs.djangoproject.com/en/dev/topics/files/,如果我使用下面的示例,它仍然无效。

    from django.core.files.storage import FileSystemStorage
    
    fs = FileSystemStorage(location='/static/images/gallery')
    
    class Car(models.Model):
        ...
        photo = models.ImageField(storage=fs)
    

新条目已正确添加但当我单击图像名称时,会显示以下错误,并且图像未放置在/ static / images / gallery

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/Library/book/12/change/002_user_experience_remastered.jpg/change/
Raised by:  django.contrib.admin.options.change_view
book object with primary key '12/change/002_user_experience_remastered.jpg' does not exist.
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

我写的代码:

from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location='/static/images/gallery')

class book(models.Model):
    name = models.CharField(max_length=128, unique=True)
    authors = models.CharField(max_length=128)
    language = models.CharField(max_length=128)
    otherDetails = models.URLField()
    availableCopies = models.IntegerField()
    borrowUntilDate = models.DateField()
    image = models.ImageField(storage=fs)
    commentName = models.CharField(max_length=128)
    commentText = models.CharField(max_length=2048)
    slug = models.SlugField(unique=True)

我的项目具有以下配置:

..\Services
    Services
    Library (my app)
    static
    templates
    venvs

从管理界面我从C:\ pics加载图片,我希望它们存储在.. \ Services \ Library \ static \ images \ gallery文件夹中。

我做错了什么?我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

来自文件:

在开发过程中,您可以使用MEDIA_ROOT视图从django.contrib.staticfiles.views.serve()投放用户上传的媒体文件。

这不适合生产使用!有关常见的部署策略,请参阅Deploying static files

例如,如果您的MEDIA_URL定义为/media/,则可以通过将以下代码段添加到urls.py来执行此操作:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

答案 1 :(得分:0)

您需要在FileSystemStorage位置指定文件夹的绝对路径,如果尚未在设置中设置base_url,则还需提供MEDIA_URL

fs = FileSystemStorage(
    location='C:/.../Services/Library/static/images/gallery',
    base_url='/gallery/'
)

参考文献: FileSystemStorage