Djangoのモデルで指定されたアップロードパスにファイルがアップロードされない理由管理者からアップロードされたときに期待されるディレクトリにアップロードされます

user9102933

Djangoで通常のCRUD操作を使用していくつかのファイルをアップロードしようとしています。ファイルは通常アップロードされている間にプロジェクトのメディアディレクトリにアップロードされており、管理領域からファイルをアップロードしようとすると、期待されるディレクトリにアップロードされます。メディア/履歴書の内部。

データベースのモデルを定義し、メディアルートも定義して、それをurlpatterns変数にも追加しました。管理者ビューからファイルをアップロードしようとすると、すべて問題なく動作しますが、通常、ファイルをアップロードしようとすると、ファイルはmedia / cvではなくmediaディレクトリに直接アップロードされます。

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'home',
]

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

プロジェクトレベルのurls.py

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('home.urls'))
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

models.py

from django.db import models
class Student(models.Model):
    cv = models.FileField(upload_to='cv')

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('student/create', views.insert_student, 
        name='create_student'),
]

views.py

from django.core.files.storage import FileSystemStorage
from django.shortcuts import redirect
from .models import Student

def insert_student(request):
    if request.method == 'POST':
        cv = request.FILES['cv']
        fs = FileSystemStorage(base_url='')
        cvname = fs.save(cv.name, cv)
        cv = fs.url(cvname)
        stud = Student(cv=cv)
        stud.save()
        return redirect('home')

student_form.html

 <form method="post" action="{% url 'create_student' %}" 
      enctype="multipart/form-data">
     {% csrf_token %}
     <input name="cv" type="file" />
     <input type="submit" value="Submit" />
 </form>

通常はフォームからアップロードするときに、ファイルがmedia / cv内にアップロードされることを期待していましたが、ファイルはメディアディレクトリにアップロードされています。管理者ログインから学生を追加すると、ファイルはmedia / cvディレクトリにアップロードされます。

dirkgroten

これが発生する理由は、モデルにファイルを保存させず、を使用して明示的に保存しているためですFileSystemStorageそのコードのどこにも、ディレクトリをに設定していませんcv

が付いたモデルを使用しFileFieldているため、ファイルを保存するためにこれを行う必要があるだけです。

stud = Student(cv=request.FILES['cv'])
stud.save()

これにより、ファイルがフォルダ内のcvディレクトリに確実に保存されmediaます。ただし、投稿されていない場合は例外が発生するrequest.FILES['cv']可能性があるため、その前にチェックを追加しKeyErrorます。また、保存する前にファイルの内容を確認することすらしていません。マルウェア/ウイルスを含むファイルを含め、誰でもこの方法で何でもアップロードできるため、これは大きなセキュリティの抜け穴です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ