首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为ImageField设置新的“路径”值

为ImageField设置新的“路径”值
EN

Stack Overflow用户
提问于 2012-08-27 11:33:55
回答 2查看 1.4K关注 0票数 1

我有以下情况。项目文件存储在~/django-app/app-old/app中。出于某些原因,我将文件移动到~/django-app/app。应用程序有一些图像,使用ImageField存储。在数据库中,图像有如下路径:

~/django-apps/app-old/app/media/images/blabla.jpeg

因此,我需要在数据库中修复这个路径,如下所示:

~django-apps/app/media/images/blabla.jpeg

为此,我尝试编写管理命令:

代码语言:javascript
复制
from django.core.management.base import BaseCommand, CommandError
from books.models import Book
import string

class Command(BaseCommand):
    help = ''

    def handle(self, *args, **options):
        books = Book.objects.all()
        total = len(books)
        curr = 1

        for book in books:
            print "%d/%d" % (curr, total)
            if book.cover_url != "":
                book.cover_url.path = string.replace(book.cover_url.path, "app-old/", "")
                book.save()
            curr+=1

通过使用此命令,我得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/var/www/dizpers/data/django-apps/app/books/management/commands/fix-covers-path.py", line 23, in handle
    book.cover_url.path = string.replace(book.cover_url.path, "bparser-old/", "")
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/files.py", line 65, in _get_path
    return self.storage.path(self.name)
  File "/usr/local/lib/python2.6/dist-packages/django/core/files/storage.py", line 234, in path
    raise SuspiciousOperation("Attempted access to '%s' denied." % name)
django.core.exceptions.SuspiciousOperation: Attempted access to '/var/www/dizpers/data/django-apps/app-old/app/media/covers/a3d9545d3a17bb68a91749019c95357d.jpeg' denied.

为什么我会收到这条错误信息?我怎样才能修复图像的路径?

UPD1

我的模型包含这样的ImageField:

代码语言:javascript
复制
cover_url = models.ImageField(upload_to=os.path.join(MEDIA_ROOT, "covers"), null=True, default=None)

UPD2

路径属性是只读的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-27 12:41:37

这应该能行

代码语言:javascript
复制
for book in books:
        print "%d/%d" % (curr, total)
        if book.cover_url != "":
            new_path = string.replace(book.cover_url.path, "app-old/", "")
            book.cover_url = new_path
            book.save()
        curr+=1
票数 3
EN

Stack Overflow用户

发布于 2012-08-27 11:47:24

由于安全原因,默认文件系统存储阻止使用绝对路径,因此收到此消息。

如果您真的想使用绝对路径

出于安全原因,django-文件强制使用绝对路径,如下所示:

代码语言:javascript
复制
from django.core.files.storage import FileSystemStorage


fs = FileSystemStorage(location=UPLOAD_TO)


class Document(models.Model):
    file = models.FileField(storage=fs, upload_to=UPLOAD_TO)

其中UPLOAD_TO可以是绝对路径。

-回答问题最新情况

如果你不需要这样的安全

那么你应该读一下关于FileField的文档

FileField.upload_to本地文件系统路径,它将被附加到MEDIA_ROOT设置中,以确定url属性的值。

在您的例子中,upload_to='covers'就足够了。

注意,应该将相对路径存储在数据库中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12141166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档