ホームページ  >  記事  >  ウェブフロントエンド  >  FileFieldカスタムアップロードファイル名の詳細説明

FileFieldカスタムアップロードファイル名の詳細説明

巴扎黑
巴扎黑オリジナル
2017-08-23 13:56:331740ブラウズ

この記事では、カスタマイズされた FileField にファイル名をアップロードする際の問題をコード例を通して紹介します。興味のある方は参考にしてください。

FileField の Upload_to 属性は、アップロードされるファイルの保存ディレクトリと名前を設定できます。またはメソッドなどの呼び出し可能なものにすることもできます。

Upload_to の値をメソッドに設定すると、アップロードされたファイルの名前を変更できます。このメソッドには、instance と filename の 2 つのパラメータが必要です。instance は FileField が属する Model インスタンス、filename はアップロードされたファイルの名前です。

例:


def user_directory_path(instance, filename):
 # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
 return &#39;user_{0}/{1}&#39;.format(instance.user.id, filename)
class MyModel(models.Model):
 upload = models.FileField(upload_to=user_directory_path)

クラスで __call__ メソッドを定義すると、それを func のように呼び出すこともできるため、upload_to の値は __call__ メソッドを定義するクラスにすることもできます。

たとえば、アップロード時間に基づいてファイル名にタイムスタンプを追加するには:


import hashlib
import os
import time
from django.utils.deconstruct import deconstructible
@deconstructible
class TimeStampFileName(object):
 def __init__(self, path):
  self.path = os.path.join(path, "%s%s")
 def __call__(self, instance, filename):
  extension = os.path.splitext(filename)[1]
  data = "%s_%d"%(filename,int(time.time()))
  file_hash = hashlib.sha1(data).hexdigest()
  return self.path % (file_hash, extension)

モデルの FileField は次のように定義できます:


class MyModel(models.Model):
 upload = models.FileField(upload_to=TimeStampFileName(&#39;media/&#39;), )

以上がFileFieldカスタムアップロードファイル名の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。