1

Djangoフレームワークに基づいてプロジェクトを変更します。アイテムを追加するフォームがあります。アイテムには表紙(画像)があります。このアイテムストアカバーのURLの現在のバージョンは次のようになります。

class Item(models.Model):
    title = models.CharField(max_length = 255, db_index = True)
    slug = models.CharField(max_length = 80, db_index = True)
    categories = models.ManyToManyField(Category)
    cover_url = models.CharField(max_length = 255, null = True, default = None)
    ...

一部の画像が他のサーバー(異なるファイルホスティング)に保存されていることに注意してください。

CharFieldをImageFieldに置き換えたい。しかし、既存のアイテムはどうですか?モデルのスキーマを変更して、以前に追加したすべての画像を保存したいと思います。どうすればこの目標を達成できますか?

たぶん、この変更のいくつかの理由が役立つことがあります。主な理由は、ユーザーが自分のコンピューターから画像をアップロードできるようにすることです(URLをそのまま挿入するだけではありません)。

TIA!

4

1 に答える 1

2

既存のソースを持つことができる場合cover_url-外部ソースを処理できるカスタムストレージが必要です。

djangoドキュメントImageFieldからのカスタムストレージの使用例を次に示します。

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

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs)

それから飛び出してみましょう。次のようなコードが表示されます。

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

def is_url(name):
    return 'http' in name

class MyStorage(FileSystemStorage):
    #We should override _save method, instead of save. 
    def _save(self, name, content=None):
        if content is None and is_url(name):
            return name
        super(MyStorage, self)._save(name, content)

fs = MyStorage()

class Item(models.Model):
    title = models.CharField(max_length = 255, db_index = True)
    slug = models.CharField(max_length = 80, db_index = True)
    categories = models.ManyToManyField(Category)
    cover_url = models.ImageField(storage=fs)

改善の余地があります。ここではアイデアのみを示しています。

于 2012-07-30T08:36:13.477 に答える