1

私はこのモデルを持っています...

class MyModel(models.Model):
    ...
    file = models.FileField(upload_to='files/',null=True, blank=True)
    ...

ファイルをアップロードすると、ファイル名の例はdocfile.doc. ファイルを変更するか、書き直して再度アップロードすると、ファイルが変わり、古いdocfile.docファイルがまだ存在します。docfile_1.docdocfile.doc

データのアップロードと保存を行っていますdjango-admin

私の質問は、docfile.doc新しいものをアップロードしdocfile.doc、ファイル名がまだdocfile.doc.

私の場合、誰かが私を助けることができますか?前もって感謝します

私はこれを試します:

def content_file_name(instance, filename):
    print instance
    print filename
    file = os.path.exists(filename)
    print file
    if file:
        os.remove(filename)
    return "file/"+str(filename)

 class MyModel(models.Model):
        ...
        file = models.FileField(upload_to=content_file_name,null=True, blank=True)
        ...

docfile.docしかし、何も起こらなかったので、もう一度アップロードするdocfile_1.docと、古いものdocfile.docがまだ存在します。

4

4 に答える 4

2

正確な方法はわかりませんが、次のリンクが役立つと思います。

ここでは、FileField が受け入れる 2 つのオプションを見つけることができます。私があなたに最も興味があると思うのはFileField.storage. そのパラメーターでストレージ オブジェクトを渡すことができます。

それは言います:

FileField.storage: オプション。ファイルの保存と取得を処理するストレージ オブジェクト。

次に、これを読む、独自のストレージ オブジェクトを作成できることがわかります。ここにそれを行う方法の説明があります。やりたいことを達成するためにメソッドをオーバーライドすることができると思います_save(つまり、ファイルが既に存在する場合は、新しいコピーを保存する前に削除してください)。

しかし、注意してください!保存しようとしているファイルのソースがどれかわかりません。おそらく、あなたのアプリは同じ名前のファイルをたくさん受け取りますが、それらはすべて異なっています。この場合、callable をFileField.upload_toパラメーターとして使用して、サイトが受信する各ファイルの一意のファイル名を決定する必要があります。

これがお役に立てば幸いです。

于 2012-05-28T04:27:34.393 に答える
1

i got it... i use this

def content_file_name(instance, filename):
    print instance
    print filename
    file = os.path.exists("media/file/"+str(filename))
    print file
    if file:
        os.remove("media/file/"+str(filename))
    return "file/"+str(filename)
于 2012-05-28T04:04:27.997 に答える
0

次のコードは問題を解決します。画像が実際にストレージに保存される pre_save メソッドをオーバーライドします。プロジェクトの関数の名前を変更してください。新しく作成した画像フィールドImageFieldWithPermantNameupload_to関数 (content_file_name) で使用します。

コードが複雑すぎる場合は、単純化できます。このコードを使用して、画像をアップロードするためのより複雑な操作を行います。カスタム _save_image 関数でオンザフライでサムネイルを作成します。だから、あなたはそれを単純化することができます。

from PIL import Image
import StringIO
from django.db.models import ImageField
from django.db.models.fields.files import FileField
from dargent.settings import MEDIA_ROOT
import os

class ImageFieldWithPermanentName( ImageField ):
    def pre_save( self, model_instance, add ):
        file = super( FileField, self ).pre_save(model_instance, add)
        if file and not file._committed:
            if callable( self.upload_to ):
                path = self.upload_to( model_instance, "" )
            else:
                path = self.upload_to
            file.name = path # here we set the same name to a file
            path = os.path.join( MEDIA_ROOT, path )
            chunks = _get_chunks( file.chunks() )
            _save_image( chunks, path )

        return file     

def _get_chunks( chunks ):
    chunks_ = ""
    for chunk in chunks:
        chunks_ += chunk
    return chunks_

def _get_image( chunks ):
    chunks_ = ""
    for chunk in chunks:
        chunks_ += chunk

    virt_file = StringIO.StringIO( chunks_ )
    image = Image.open( virt_file )
    return image

def _save_image( chunks, out_file_path ):
    image = _get_image( chunks )
    image.save( out_file_path, "JPEG", quality = 100 )
于 2012-05-29T06:21:23.463 に答える
0

ここでも見ることができます:ImageFieldは同じ名前の画像ファイルを上書きします

独自のストレージを定義し、get available_name メソッドを上書きします。

于 2012-05-28T09:07:42.617 に答える