2017-09-12 6 views
0

私は、誰かが既にモデルフォームでアップロードされているファイルをアップロードしようとすると、フォームが投稿できないようにしようとしています。ここに関連するコードは次のとおりです。ファイルがDjangoにすでに存在する場合、ファイルアップロードを完全に防ぐ

models.py

class File(models.Model): 
    file = models.FileField(upload_to='documents/') 

forms.py

class FileForm(forms.ModelForm): 
    file = forms.FileField() 

    class Meta: 
     model = File 
     fields = ('file',) 

views.py

def file_upload(request): 
    if request.method == 'POST': 
     form = FileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return redirect('list_files') 
     else: 
      logger.error(form.errors) 
    else: 
     form = FileForm() 

    return render(request, 'files/file_upload.html', {'form': form}) 

はの誰かがdocument_1.xlsxと呼ばれるファイルをアップロードしましょう。このコードが今のところ、誰かがdocument_1.xlsxという別のファイルをアップロードしようとすると、それがアップロードされ、ドットの前に奇妙なサフィックスが追加されます。私はそれを望んでいない。私は、フォームを壊すことなく、誰もがすでに存在するファイルをアップロードすることを許可しないようにしたい。どうやら、モデルのファイルフィールドに 'unique = True'を追加しても機能しません。私はファイルが既に存在する場合、ファイルの名前を変更する方法を尋ねる多くの質問を見てきましたが、私はそれを望んでいません。そのファイル名が既に存在する場合は、完全に停止します。ありがとう。

編集:これは別の質問と重複しているとは思わない。その質問は、同じ名前のファイルを上書きする方法を尋ねます。この質問は、同じ名前のファイルがアップロードされないようにする方法を尋ねています。

+0

その名前のファイルが既に存在する場合は、ファイル名を変更するのDjangoのを防止する【使い方の可能性のある重複? ](https://stackoverflow.com/questions/9214904/how-to-prevent-django-from-changing-file-name-when-a-file-with-that-name-already) –

+0

文書:https:/ /docs.djangoproject.com/ja/1.11/ref/forms/validation/#cleaning-a-specific-field-attribute – allcaps

答えて

1

保存する前にファイルが存在するかどうかをチェックするロジックを追加するには、フォームのデフォルトのクリーンメソッドをオーバーライドする必要があります。

は、あなたのFileFormクラスに以下をお試しください:

import os 
from django.core.exceptions import ValidationError 

def clean(self): 
    file_path = "your folder/" + self.cleaned_data.get('file') 
    if os.path.isfile(file_path): 
     raise ValidationError('File already exists') 
    return self.cleaned_data 
+0

これはどのモジュールに入っていますか?あなたはそれがFileFormクラス内のforms.pyになければならないと言っていますか?それはMetaの前後に行かなければならないのですか? –

+0

はい、あなたのform.pyに、クラスMetaの後です。 – Hisagr

+0

明らかに、ファイルをアップロードしようとするとこのエラーが表示されました: 'InMemoryUploadedFile'オブジェクトを暗黙的にstrに変換できません –

0

あなたは、フォームのきれいな方法でこれを達成することができます。その名前のフォームがあるかどうかだけをチェックしてください。存在する場合は、検証エラーを発生させます。何かのように:(私はこれがうまくいくことを100%ではないよしかし、解決策は、この行の下です。)

def clean_file(self): 
    file = self.cleaned_data['file'] 
    if FileModel.objects.filter(file__name=file.name).exist(): 
     raise ValidationError('There is already a file with that name on our system') 
関連する問題