前提・実現したいこと
Djangoを使って仕事でつかえるファイル保管アプリを作成したいと考えています。
まず、業務No.を登録し、業務Noと1対多の関係でファイルを保管します。保管先のフォルダは業務Noごとにフォルダ分けがされるようにします。
発生している問題・エラーメッセージ
Djangoの入門書を参考に以下のようなモデルを作成しました。
python
1#models.py 2from django.db import models 3from django.db.models.fields.files import FileField 4 5class Gyomu (models.Model): 6 Number = models.IntegerField(default=1) 7 8class GyomuFile(models.Model): 9 Key = models.ForeignKey(Gyomu, on_delete = models.CASCADE) 10 File = models.FileField(upload_to="GyomuFile")
Djangoの管理画面からファイルを登録すると、1対多の関係でファイルを保管することはできます。
しかし、業務Noにかかわらず、保存先のフォルダがすべて「GyomuFile」となってしまい、名前が同じファイルを保存すると勝手にリネームされてしまいます。
下記のようなフォルダ構成でファイルが保管されるようにし、リネームを防ごうと思います。
・GyomuFile
├1
│├ファイル1
│├ファイル2
│└ファイル3
└2
├ファイル1
└ファイル2
試したこと
下記のようにモデルを書き換えてみました。これでmigrateはできたのですが、管理画面からファイルをアップロードしようとすると「OSError at /admin/TestApp/gyomufile/add/[WinError 123] ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」とエラーになってしまいます。
python
1#models.py 2from django.db import models 3from django.db.models.fields.files import FileField 4import os 5 6class Gyomu (models.Model): 7 Number = models.IntegerField(default=1) 8 9class GyomuFile(models.Model): 10 Key = models.ForeignKey(Gyomu, on_delete = models.CASCADE) 11 File = models.FileField(upload_to= os.path.join("GyomuFile" + str(Gyomu.Number)))
該当のソースコード
models以外のソースコードは以下の通りです。
python
1#settings.py 2 3STATIC_URL = '/static/' 4 5MEDIA_ROOT = os.path.join(BASE_DIR, 'File') 6MEDIA_URL = '/media/' 7 8 9# urls.py 10from django.conf import settings 11from django.conf.urls.static import static 12 13urlpatterns = [ 14 path('admin/', admin.site.urls), 15] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 16 17 18#admin.py 19from django.contrib import admin 20from .models import Gyomu, GyomuFile 21 22admin.site.register(Gyomu) 23admin.site.register(GyomuFile) 24
補足情報(FW/ツールのバージョンなど)
・Django 3.2.4
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。