1

次のような状況があります。プロジェクト ファイルは ~/django-apps/app-old/app に保存されました。何らかの理由で、ファイルを ~/django-apps/app に移動します。アプリケーションには、ImageField を使用して保存されたいくつかの画像があります。データベース イメージには、次のようなパスがあります。

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

したがって、データベース内のこのパスを次のように修正する必要があります。

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

これを行うための管理コマンドを作成しようとしています:

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

このコマンドを使用すると、次のエラーが発生します。

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 が含まれています。

cover_url = models.ImageField(upload_to=os.path.join(MEDIA_ROOT, "covers"), null=True, default=None)

UPD2

パス プロパティは読み取り専用です

4

2 に答える 2

3

これはうまくいくはずです

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
于 2012-08-27T12:41:37.860 に答える
1

デフォルトのファイル システム ストレージでは、セキュリティ上の理由から絶対パスを使用できないため、このメッセージが表示されます。

本当に絶対パスを使いたい場合

django-documentsは、セキュリティ上の理由から絶対パスを強制します。これは次のとおりです。

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 url 属性の値を決定するために MEDIA_ROOT 設定に追加されるローカル ファイル システム パス。

あなたの場合、upload_to='covers'十分です。

データベースには相対パスを格納する必要があることに注意してください。

于 2012-08-27T11:47:24.283 に答える