DjangoのMultiValueDictKeyErrorに関して
解決したいこと
Djangoの学習をするためにWebアプリを作成しています。
NullBooleanFieldを使ってプルダウンメニューを実装する際にエラーが発生しました。
原因と解決方法を教えていただけると助かります。
(コード内に学習中に記載したコメント残ってます。分かりにくかったら申し訳ないです。)
開発環境
python 3.10.5
Django 3.0.4
発生している問題・エラー
django.utils.datastructures.MultiValueDictKeyError: 'check'
該当するソースコード
forms.py
from django import forms
class HelloForm(forms.Form): #HelloFormクラスにforms.Formクラスを継承
check = forms.NullBooleanField(label='Check') #プルダウン用のクラスNullBooleanFieldクラスを元にcheckインスタンスを生成
views.py
from tkinter.messagebox import NO
from turtle import pd
from django.shortcuts import render
from django.http import HttpResponse #HttpResponseクラスをimportする
from django.views.generic import TemplateView #TemplateViewクラスを呼び出す
from .forms import HelloForm #forms.pyのHelloFormクラスを呼び出す
class HelloView(TemplateView):
def __init__(self):
self.params = {
'title':'Hello', #テンプレート側で変数として定義した名前をキーとする辞書を作成
'massage':'your data',
'result':None,
}
def get(self, request): #GETメソッドで値が渡された時の処理
return render(request, 'hello/index.html', self.params) #レンダリング時にself.paramsを戻り値として返すだけの処理
def post(self, request): #POSTメソッドで値が渡された時の処理
chk = request.POST['check']
self.params['result'] = 'you selected: "' + chk + '"'
return render(request, 'hello/index.html', self.params)
index.html
{% load static %} <!--静的ファイルをロードする-->
<!doctype html> <!--DOCTYPE宣言と呼ばれる文書タイプがhtmlであることを示す-->
<html lang="ja"> <!--このhtml要素内でしようされる言語は日本語だということ,ブラウザに言語を認識させるイメージ-->
<head>
<meta charset="utf-8"> <!--メタ要素というページに関する様々な情報を記述する要素、今回はutf-8という文字コードに設定している-->
<title>{{title}}</title> <!--テンプレートで使用できる変数にtitleを追加-->
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
crossorigin="anonymous">
</head>
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p class="h5 mt-4">{{result|safe}}</p>
<form action="{% url 'index' %}" method="post"> <!--formタグのaction属性にフォームによって送信された情報を処理するプログラムのurlを指定、method属性でhttpメソッドをpostメソッドに指定-->
{% csrf_token %} <!--CSRF(リクエスト偽造)対策用のトークンを追加、これで「正しくフォームから送信されたアクセスかどうかを判定できる」-->
<table>
{{ form.as_p }} <!--呼び出したFormクラスのフィールドをpタグでくくってBootstrapでのデザインを使う-->
<tr><td></td><td>
<input type="submit" class="btn btn-primary my-2" value="click"> <!--inputタグのtype属性をsubmitにすることで送信ボタンを作成、value属性をclickに指定-->
</td>
</table>
</form>
</body>
</html>
自分で試したこと
chk = request.POST['check']の部分で存在しないキーを呼び出している、といったエラーが出ている。
というところまで分かったのですが、特に解決方法が分かりませんでした。
BooleanFieldを用いた同様の処理ではうまくいっていたのですが、何故エラーが出ているのか皆目見当も付かず・・・
長文での質問恐縮ですがよろしくお願いします。
0