2017-02-15 10 views
2

ウェブブラウザからファイルimage.pngをアップロードすると、サーバー上のアップロードディレクトリにimage.pngという名前の新しいファイルが表示されます。Djangoはアップロードされたファイルの名前をどのように変更しますか?

image.png(同じ名前)という別のファイルをアップロードすると、image_aj642zm.pngという名前の新しいファイルがサーバーのアップロードディレクトリに表示されます。

image.png(同じ名前)という別のファイルをアップロードすると、image_z6z2BaQ.pngという名前の新しいファイルがサーバーのアップロードディレクトリに表示されます。

Djangoは、アップロードされたファイルの名前を変更するために、その名前のファイルがアップロードディレクトリに既に存在する場合、どのような方法を使用しますか? (すなわち、余分な_aj642zm_z6z2BaQから来るんどこ?)

通常のセット・アップ:models.pyで

forms.pyで
from django.db import models 

class Image(models.Model): 
    image = models.ImageField(upload_to='uploads/') 

from django import forms 
from .models import Image 

class ImageForm(forms.ModelForm): 
    class Meta: 
     model = Image 
     fields = ['image'] 

inVisit.py:

from django.shortcuts import render, redirect 
from .forms import ImageForm 

def upload_image(request): 
    if request.method == 'POST': 
     form = ImageForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return redirect('index') 
     else: 
      form = ImageForm() 

    return render(request, 'upload_file.html', {'form': form}) 
+0

モデル定義のupload_toパラメータを確認してください。 –

+0

@BipulJain upload_to引数は、アップロードされたファイルをどこに置くかを指定します。名前の変更については何も言わない。多分私は何かを欠いているでしょうか? – Flux

+0

そこにメソッドを指定できます。論理の名前を変更する必要があります。 –

答えて

3

Djangoのデフォルトのストレージクラスメソッドは、デフォルトでget_available_name

# If the filename already exists, add an underscore and a random 7 
    # character alphanumeric string (before the file extension, if one 
    # exists) to the filename until the generated filename doesn't exist. 
    # Truncate original name if required, so the new filename does not 
    # exceed the max_length. 

ジャンゴと呼ばれるが、その名前でオブジェクトを保存だけでなく、コードのコメント

に引用されたように、その名前のオブジェクトがすでに存在する場合は、アンダースコアと7つのランダムな文字を追加しますこのDjango Storageクラスメソッドに加えてget_valid_nameはファイル名を前に解析し、すべてのスペースをアンダースコアで置き換え、ユニコード、アルファベット、ダッシュ、アンダースコアまたはドット以外のすべての文字を削除します

re.sub(r'(?u)[^-\w.]', '', s) 
関連する問題