質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2860閲覧

Django ファイル選択入力で正常実行しているのにエラーメッセージが表示されてしまう。

akane_emo

総合スコア30

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/13 01:41

編集2021/09/14 14:00

前提・実現したいこと

Djangoでファイルを選択してボタンをクリックしてアップロードする処理を
作成しています。

発生している問題・エラーメッセージ

処理は問題なく実行されているのにも関わらず実行後にファイル選択入力の上に
以下のメッセージが表示されてしまいます。
「ファイルを選択」の右のメッセージも「選択されていません」になってしまっています。

実行後はエラーメッセージおよびファイル選択の右のメッセージも表示させないようにするには
どうしたらいいのでしょうか。
よろしくお願いします。

エラーメッセージ ・このフィールドは必須です。

イメージ説明
(左:実行前 右:実行後)

該当のソースコード

python View.py def UploadOrder(request): # POST送信処理 if request.method == 'POST': # フォームの用意 order_file_form = UploadFileForm(request.FILES['file']) # 処理記述~ # GETアクセス時の処理 else: # フォームの用意 order_file_form= UploadFileForm() # 共通処理 params = { 'upload_form':order_file_form, } return render(request, '/index.html', params)
python forms.py class UploadFileForm(forms.Form): file = forms.FileField(required=True, label='')
python template layout.html {% load static %} <!DOCTYPE html> <html lang="ja"> <head> <!-- Required meta tags always come first --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>{% block title %}{% endblock %}</title> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous"> </head> <body class="container"> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <ul class="navbar ml-auto"> <span>logind: <span class="h6">{{login_user}}</span></span> </ul> </nav> <div>{% block header %} {% endblock header %} </div> <div class="content">{% block content %} {% endblock content %} </div> <hr> <div class="my-3"> <span class-"font-weight-bold"> <a href="/admin/logout?next=/"> [ logout ]<a> </span> </div> </body> </html>
python template index.html {% block content %} <hr> <div> <form action="{% url 'index_webedi'%}" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="hidden" name="mode" value="__upload_form__"> {{ upload_form }} <br> <br> <button class="btn btn-primary mt-1">アップロード</button> </form> </div> {% endblock %}

試したこと

forms.pyのreauired=TrueをFalseにすれば無くなるのですが、
入力必須のためTrueのままにしておきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2021/09/14 10:38

どうも該当コードをそのまま使っても、フォームが表示されないようです。 再現コードを書いてみたので、何か違っている部分がないかどうか確認して頂けないでしょうか? 下のpythonコードを全角空白を半角空白2個に置換して空ディレクトリで実行すると、自動的に再現コードを構築します。構築後はvenvで仮想環境をactivateしてもらえば、そのままdjangoが動きます。 project名はmysiteでapplication名はmyappです。 ENV_NAME='env' import venv venv.main([ENV_NAME]); builder = venv.EnvBuilder(); context = builder.ensure_directories(ENV_NAME) import os current_path = os.path.abspath('.') base_dir = os.path.abspath(os.path.join(current_path,context.bin_path)) python_path = os.path.join(base_dir, 'python') pip_path = os.path.join(base_dir, 'pip') django_admin_path = os.path.join(base_dir, 'django-admin') import subprocess subprocess.run([pip_path,'install','Django==3.2.7', 'diff-match-patch==20200713']) subprocess.run([django_admin_path, 'startproject', 'mysite']) project_path = os.path.join(current_path, 'mysite') subprocess.run([python_path, 'manage.py', 'startapp', 'myapp'], cwd = project_path) with open('generated.py', mode='w', encoding='utf-8') as f:   f.write('import os, shutil\n')   f.write('from diff_match_patch import diff_match_patch\n')   f.write('dmp = diff_match_patch()\n')   f.write("with open('./mysite/myapp/views.py', encoding='utf-8') as f:\n")   f.write('  content = dmp.patch_apply(dmp.patch_fromText("@@ -33,31 +33,451 @@\\n der%0A\\n-%0A# Create your views here.%0A\\n+from .forms import UploadFileForm%0A%0A# Create your views here.%0Adef hello(request):%0A  # POST%E9%80%81%E4%BF%A1%E5%87%A6%E7%90%86%0A  if request.method == \'POST\':%0A%0A    # %E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E7%94%A8%E6%84%8F    %0A    order_file_form = UploadFileForm(request.FILES%5B\'file\'%5D)%0A%0A    # %E5%87%A6%E7%90%86%E8%A8%98%E8%BF%B0%EF%BD%9E%0A%0A  # GET%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%99%82%E3%81%AE%E5%87%A6%E7%90%86%0A  else:%0A%0A    # %E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E7%94%A8%E6%84%8F%0A    order_file_form= UploadFileForm()%0A%0A  # %E5%85%B1%E9%80%9A%E5%87%A6%E7%90%86%0A  params = %7B%0A    \'upload_form\':order_file_form,%0A  %7D%0A%0A  return render(request, \'myapp/index.html\')\\n"), \'\'.join(f.readlines()))\n')   f.write("with open('./mysite/myapp/views.py', 'w', encoding='utf-8') as f:\n")   f.write('  f.write(content[0])\n')   f.write("with open('./mysite/mysite/urls.py', encoding='utf-8') as f:\n")   f.write('  content = dmp.patch_apply(dmp.patch_fromText("@@ -684,16 +684,25 @@\\n ort path\\n+, include\\n %0A%0Aurlpat\\n@@ -748,10 +748,53 @@\\n .urls),%0A\\n+  path(\'myapp/\', include(\'myapp.urls\')),%0A\\n %5D%0A\\n"), \'\'.join(f.readlines()))\n')   f.write("with open('./mysite/mysite/urls.py', 'w', encoding='utf-8') as f:\n")   f.write('  f.write(content[0])\n')   f.write("with open('./mysite/mysite/settings.py', encoding='utf-8') as f:\n")   f.write('  content = dmp.patch_apply(dmp.patch_fromText("@@ -871,24 +871,37 @@\\n ED_APPS = %5B%0A\\n+  \'myapp\',%0A\\n   \'django.\\n@@ -2885,13 +2885,10 @@\\n = \'\\n-en-us\\n+ja\\n \'%0A%0AT\\n@@ -2903,11 +2903,18 @@\\n = \'\\n-UTC\\n+Asia/Tokyo\\n \'%0A%0AU\\n"), \'\'.join(f.readlines()))\n')   f.write("with open('./mysite/mysite/settings.py', 'w', encoding='utf-8') as f:\n")   f.write('  f.write(content[0])\n')   f.write("if not os.path.isdir('./mysite/myapp/templates'):\n")   f.write("  os.mkdir('./mysite/myapp/templates')\n")   f.write("with open('./mysite/myapp/forms.py', mode='w', encoding='utf-8') as f:\n")   f.write("  f.write('from django import forms\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('class UploadFileForm(forms.Form):\\n')\n")   f.write('  f.write("  file1 = forms.FileField(required=True, label=\'ファイル1\')\\n")\n')   f.write('  pass\n')   f.write("with open('./mysite/myapp/urls.py', mode='w', encoding='utf-8') as f:\n")   f.write("  f.write('from django.urls import path\\n')\n")   f.write("  f.write('from . import views\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('urlpatterns = [\\n')\n")   f.write('  f.write("  path(\'\', views.hello, name=\'index\'), #urlに/app/indexと入力するとviews.pyのindex関数が呼び出される。(nameは他のテンプレートからviewを呼び出す際に用いるが、この記事では無関係)\\n")\n')   f.write("  f.write(']')\n")   f.write('  pass\n')   f.write("if not os.path.isdir('./mysite/myapp/templates/myapp'):\n")   f.write("  os.mkdir('./mysite/myapp/templates/myapp')\n")   f.write("with open('./mysite/myapp/templates/myapp/index.html', mode='w', encoding='utf-8') as f:\n")   f.write("  f.write('<!DOCTYPE html>\\n')\n")   f.write('  f.write(\'<html lang="ja">\\n\')\n')   f.write("  f.write('\\n')\n")   f.write("  f.write('<head>\\n')\n")   f.write('  f.write(\'  <meta charset="utf8">\\n\')\n')   f.write("  f.write('</head>\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('<body>\\n')\n")   f.write("  f.write('  {% block content %}\\n')\n")   f.write("  f.write('  <hr>\\n')\n")   f.write("  f.write('  <div>\\n')\n")   f.write('  f.write(\'    <form action="{% url \\\'index\\\'%}" method="post" enctype="multipart/form-data">\\n\')\n')   f.write("  f.write('      {% csrf_token %}\\n')\n")   f.write("  f.write('\\n')\n")   f.write('  f.write(\'      <!--<input type="hidden" name="mode" value="__upload_form__">-->\\n\')\n')   f.write("  f.write('      {{ upload_form.as_p }}\\n')\n")   f.write("  f.write('      <br>\\n')\n")   f.write("  f.write('      <br>\\n')\n")   f.write('  f.write(\'      <button class="btn btn-primary mt-1">アップロード</button>\\n\')\n')   f.write("  f.write('    </form>\\n')\n")   f.write("  f.write('  </div>\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('  {% endblock %}\\n')\n")   f.write("  f.write('</body>\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('</html>')\n")   f.write('  pass\n') subprocess.run([python_path, 'generated.py'])
akane_emo

2021/09/14 14:02

dameo様 閲覧及びご指摘ありがとうございます。 base.htmlがないとアップロードボタンが表示されないのを確認しました。 layout.htmlを追加しましたのでよろしくお願いします。
dameo

2021/09/14 14:15

extendsタグによるテンプレートの拡張は、基本的に各テンプレートに共通する下地みたいなものを記述します。そしてそれがextendsタグを書いたテンプレート内の変数のレンダリングに影響することはないと思います。 ご自身で書かれた現象を起こす最小の再現用コードは動かして確認されているのでしょうか? ここが正しくないと誰も原因を考えられないと思いますよ。
dameo

2021/09/14 14:39

すみません。私の方でviewにparamを渡してないだけでした。現象再現したみたいです。
dameo

2021/09/14 15:04

まずは再現した再現コードをあげておきます。例によって全角空白を半角空白2つに置換した上でからディレクトリで実行してください。 ENV_NAME='env' import venv venv.main([ENV_NAME]); builder = venv.EnvBuilder(); context = builder.ensure_directories(ENV_NAME) import os current_path = os.path.abspath('.') base_dir = os.path.abspath(os.path.join(current_path,context.bin_path)) python_path = os.path.join(base_dir, 'python') pip_path = os.path.join(base_dir, 'pip') django_admin_path = os.path.join(base_dir, 'django-admin') import subprocess subprocess.run([pip_path,'install','Django==3.2.7', 'diff-match-patch==20200713']) subprocess.run([django_admin_path, 'startproject', 'mysite']) project_path = os.path.join(current_path, 'mysite') subprocess.run([python_path, 'manage.py', 'startapp', 'myapp'], cwd = project_path) with open('generated.py', mode='w', encoding='utf-8') as f:   f.write('import os, shutil\n')   f.write('from diff_match_patch import diff_match_patch\n')   f.write('dmp = diff_match_patch()\n')   f.write("with open('./mysite/myapp/views.py', encoding='utf-8') as f:\n")   f.write('  content = dmp.patch_apply(dmp.patch_fromText("@@ -33,31 +33,517 @@\\n der%0A\\n-%0A# Create your views here.%0A\\n+from .forms import UploadFileForm%0A%0A# Create your views here.%0Adef hello(request):%0A  # POST%E9%80%81%E4%BF%A1%E5%87%A6%E7%90%86%0A  if request.method == \'POST\':%0A%0A    # %E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E7%94%A8%E6%84%8F    %0A    order_file_form = UploadFileForm(request.FILES%5B\'file\'%5D)%0A    if (order_file_form.is_valid()):%0A      pass%0A%0A    # %E5%87%A6%E7%90%86%E8%A8%98%E8%BF%B0%EF%BD%9E%0A%0A  # GET%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%99%82%E3%81%AE%E5%87%A6%E7%90%86%0A  else:%0A%0A    # %E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E7%94%A8%E6%84%8F%0A    order_file_form= UploadFileForm()%0A%0A  # %E5%85%B1%E9%80%9A%E5%87%A6%E7%90%86%0A  params = %7B%0A    \'upload_form\':order_file_form,%0A  %7D%0A%0A  return render(request, \'myapp/index.html\', params)\\n"), \'\'.join(f.readlines()))\n')   f.write("with open('./mysite/myapp/views.py', 'w', encoding='utf-8') as f:\n")   f.write('  f.write(content[0])\n')   f.write("with open('./mysite/mysite/urls.py', encoding='utf-8') as f:\n")   f.write('  content = dmp.patch_apply(dmp.patch_fromText("@@ -684,16 +684,25 @@\\n ort path\\n+, include\\n %0A%0Aurlpat\\n@@ -748,10 +748,53 @@\\n .urls),%0A\\n+  path(\'myapp/\', include(\'myapp.urls\')),%0A\\n %5D%0A\\n"), \'\'.join(f.readlines()))\n')   f.write("with open('./mysite/mysite/urls.py', 'w', encoding='utf-8') as f:\n")   f.write('  f.write(content[0])\n')   f.write("with open('./mysite/mysite/settings.py', encoding='utf-8') as f:\n")   f.write('  content = dmp.patch_apply(dmp.patch_fromText("@@ -871,24 +871,37 @@\\n ED_APPS = %5B%0A\\n+  \'myapp\',%0A\\n   \'django.\\n@@ -2885,13 +2885,10 @@\\n = \'\\n-en-us\\n+ja\\n \'%0A%0AT\\n@@ -2903,11 +2903,18 @@\\n = \'\\n-UTC\\n+Asia/Tokyo\\n \'%0A%0AU\\n"), \'\'.join(f.readlines()))\n')   f.write("with open('./mysite/mysite/settings.py', 'w', encoding='utf-8') as f:\n")   f.write('  f.write(content[0])\n')   f.write("if not os.path.isdir('./mysite/myapp/templates'):\n")   f.write("  os.mkdir('./mysite/myapp/templates')\n")   f.write("with open('./mysite/myapp/forms.py', mode='w', encoding='utf-8') as f:\n")   f.write("  f.write('from django import forms\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('class UploadFileForm(forms.Form):\\n')\n")   f.write('  f.write("  file = forms.FileField(required=True, label=\'ファイル\')\\n")\n')   f.write('  pass\n')   f.write("with open('./mysite/myapp/urls.py', mode='w', encoding='utf-8') as f:\n")   f.write("  f.write('from django.urls import path\\n')\n")   f.write("  f.write('from . import views\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('urlpatterns = [\\n')\n")   f.write('  f.write("  path(\'\', views.hello, name=\'index\'), #urlに/app/indexと入力するとviews.pyのindex関数が呼び出される。(nameは他のテンプレートからviewを呼び出す際に用いるが、この記事では無関係)\\n")\n')   f.write("  f.write(']')\n")   f.write('  pass\n')   f.write("if not os.path.isdir('./mysite/myapp/templates/myapp'):\n")   f.write("  os.mkdir('./mysite/myapp/templates/myapp')\n")   f.write("with open('./mysite/myapp/templates/myapp/index.html', mode='w', encoding='utf-8') as f:\n")   f.write("  f.write('<!DOCTYPE html>\\n')\n")   f.write('  f.write(\'<html lang="ja">\\n\')\n')   f.write("  f.write('\\n')\n")   f.write("  f.write('<head>\\n')\n")   f.write('  f.write(\'  <meta charset="utf8">\\n\')\n')   f.write("  f.write('</head>\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('<body>\\n')\n")   f.write("  f.write('  {% block content %}\\n')\n")   f.write("  f.write('  <hr>\\n')\n")   f.write("  f.write('  <div>\\n')\n")   f.write('  f.write(\'    <form action="{% url \\\'index\\\'%}" method="post" enctype="multipart/form-data">\\n\')\n')   f.write("  f.write('      {% csrf_token %}\\n')\n")   f.write("  f.write('\\n')\n")   f.write('  f.write(\'      <!--<input type="hidden" name="mode" value="__upload_form__">-->\\n\')\n')   f.write("  f.write('      {{ upload_form }}\\n')\n")   f.write("  f.write('      <br>\\n')\n")   f.write("  f.write('      <br>\\n')\n")   f.write('  f.write(\'      <button class="btn btn-primary mt-1">アップロード</button>\\n\')\n')   f.write("  f.write('    </form>\\n')\n")   f.write("  f.write('  </div>\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('  {% endblock %}\\n')\n")   f.write("  f.write('</body>\\n')\n")   f.write("  f.write('\\n')\n")   f.write("  f.write('</html>')\n")   f.write('  pass\n') subprocess.run([python_path, 'generated.py'])
dameo

2021/09/14 15:14 編集

次に判明した原因です。 order_file_formのis_valid()がFalseだから。一言でいってエラーになっています。 その原因は、 order_file_form = UploadFileForm(request.FILES['file']) ではなく order_file_form = UploadFileForm(request.POST, request.FILES) である必要があるからです。 https://docs.djangoproject.com/en/3.2/ref/forms/api/#binding-uploaded-files-to-a-form https://docs.djangoproject.com/en/3.2/topics/http/file-uploads/#basic-file-uploads
akane_emo

2021/09/15 13:04

dameo様 ありがとうございます。 参考にしたサイトでは(request.FILES['file'])だったのですが、公式や他のサイトで改めて調べると (request.POST, request.FILES)ですね。 意図通りに動くようになりました! ありがとうございました。
guest

回答1

0

自己解決

dameo様

ありがとうございます。
参考にしたサイトでは(request.FILES['file'])だったのですが、公式や他のサイトで改めて調べると
(request.POST, request.FILES)ですね。
意図通りに動くようになりました!

ありがとうございました。

(修正依頼でのご指摘だったので改めてこちらの自己解決にも記載させて頂きます。)

投稿2021/09/15 13:06

akane_emo

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問