0

ファイルを保存するためのモデルがあります。

class AFile(models.Model):
    path = models.CharField(max_length=256)
    name = models.CharField(max_length=256)
    file = models.FileField(upload_to=get_path)

ファイルを保存する多くのビューがあります。それぞれに別々のパスが必要です。そのため、モデルにパスを配置し、それをgetpath関数で使用します。そのようです:

afile = AFile(path='blah/foo/', name='filex.jpg')
afile.save()

したがって、ファイルは適切な場所にあります。しかし、パスと名前のフィールドをデータベースに保存したくはありません。パスを生成するためだけにあります。追加のモデルフィールドなしでこれと同じことを達成する方法はありますか?

4

4 に答える 4

3

ここでの問題は、モデルでまたはをupload_to定義する場合にのみ使用できることです。フィールドへの後続のアクセスはインスタンスを返しますが、これは定義された へのアクセスを持っていません。要するに、メソッドが最初に定義された後にメソッドを変更する方法はありません。FileFieldImageFieldFieldFileupload_to

ただし、その周りで一種のエンドランを実行できる場合があります。私は実際にこれを試していませんが、うまくいくはずです:

最初に、モデルにインスタンス変数を設定する単純なタスクを持つメソッドをモデルに定義します。

def set_upload_to_info(self, path, name):
    self.upload_to_info = (path, name)

次に、upload_toメソッド内で、これらの属性の存在をテストし、それらが次の場合に使用できます。

def my_upload_to(instance, filename):
    if hasattr(instance, 'upload_to_info'):
        path, name = instance.upload_to_info
        # do something and return file path
    else:
        # standard upload_to bit here

次に、ビューで、モデルを保存する前に、作成したメソッドを呼び出すだけです。

afile.set_upload_to_info(path, name)
afile.save()
于 2012-08-03T15:11:15.273 に答える
2

モデルを保存する前にfield.upload_to属性を変更することで、引数へのアップロードをビューで変更できます。FileField私の場合、フォームと一緒にクラスベースのビューを使用していました。モデルインスタンスの前に。以下のコードを使用して、アップロードをパスに変更しました。

with transaction.atomic():
        model_instance = form.save(commit=False)
        model_instance.creator = self.request.user
        model_instance.img_field.field.upload_to = 'directory/'+model_instance.name+'/logo'
        self.object = form.save()

つまり、画像フィールドの名前が imageupload の場合は、imageupload.field.upload_toそれに応じて必要なパスを指すように変更します。このアプローチで問題が解決したかどうかをお知らせください。

于 2016-10-13T10:20:52.397 に答える
1

インスタンスからパスを生成してみませんか?

def generate_path(instance, filename):
    return os.path.join("hardcoded_prefix", instance.name, filename)

class AFile(models.Model):
    name = models.CharField(max_length=256)
    file = models.FileField(upload_to=generate_path)
于 2012-08-03T13:18:59.817 に答える
0

解決策は、いくつかの非永続フィールドを入れて、引き続き get_path メソッドでそれらを参照することです

class AFile(models.Model):
    name = models.CharField(max_length=256)
    file = models.FileField(upload_to=get_path)
    path = ''
于 2012-08-05T07:40:55.940 に答える