発生していた問題・エラー
jpgファイルがアップロードできない。
エラーの原因・解決方法
- ファイルを扱う場合、request.POSTだけでなく、request.FILESもフォームに渡す必要がある
- ファイルアップロードには、フォームにenctype="multipart/form-data"を設定することで、ファイルデータが正しく送信される
views.py
def book_create(request):
if request.method == 'POST':
form = BookForm(request.POST)# request.FILESを追加して、ファイルも処理できるようにする
if form.is_valid():
form.save()
return redirect('book_list')
else:
form = BookForm()
return render(request, 'book/book_create.html', {'form': form})
def book_edit(request, id):
book = get_object_or_404(Book, id=id)
if request.method == 'POST':
form = BookForm(request.POST, instance=book)# request.FILESを追加して、ファイルも処理できるようにする
if form.is_valid():
form.save()
return redirect('book_list')
else:
form = BookForm(instance=book)
return render(request, 'book/book_form.html', {'form': form})
book_form.html
<h2>{% if form.instance.id %}本のタイトルと著者を編集する{% else %}新しい本を追加する{% endif %}</h2>
<!-- ファイルアップロードがある場合には、必ずenctype="multipart/form-data"を指定 -->
<form method="POST"> <!-- ここにenctype="multipart/form-data"を追加 -->
{% csrf_token %}
<p>
<label for="id_title">Title:</label>
{{ form.title }}
</p>
<p>
<label for="id_author">Author:</label>
{{ form.author }}
</p>
<p>
<label for="id_amazon_url">Amazon URL:</label>
{{ form.amazon_url }}
</p>
<p>
<label for="id_image">Image:</label>
{{ form.image }}
</p>
<button type="submit">保存</button>
</form>
無事、jpgファイルがアップロードできるようになりました。