オブジェクトをデータベースに保存しようとしていますが、MultiValueDictKeyError
エラーが発生します。
問題はフォーム内にありis_private
、チェックボックスで表されます。チェックボックスが選択されていない場合、明らかに何も渡されません。ここでエラーが発生します。
この例外を適切に処理してキャッチするにはどうすればよいですか?
ラインは
is_private = request.POST['is_private']
オブジェクトをデータベースに保存しようとしていますが、MultiValueDictKeyError
エラーが発生します。
問題はフォーム内にありis_private
、チェックボックスで表されます。チェックボックスが選択されていない場合、明らかに何も渡されません。ここでエラーが発生します。
この例外を適切に処理してキャッチするにはどうすればよいですか?
ラインは
is_private = request.POST['is_private']
回答:
MultiValueDictのget
メソッドを使用します。これは標準の辞書にもあり、値が存在しない場合にデフォルトを提供しながら値をフェッチする方法です。
is_private = request.POST.get('is_private', False)
一般的に、
my_var = dict.get(<key>, <default>)
checked
場合は送信されますが、オフのnull
場合は送信されます。これは、Chrome / Firefox DEVツールの[ネットワーク]パネルで確認できます。そのためFalse
、デフォルト値として設定します。取得した場合はnull
、それを作成しfalse
ます。
あなたに最適なものを選択してください:
is_private = request.POST.get('is_private', False);
is_private
request.POSTにキーが存在する場合、is_private
変数はそれに等しくなります。そうでない場合、Falseに等しくなります。
if 'is_private' in request.POST:
is_private = request.POST['is_private']
else:
is_private = False
from django.utils.datastructures import MultiValueDictKeyError
try:
is_private = request.POST['is_private']
except MultiValueDictKeyError:
is_private = False
is_private
モデルで次のように定義しようとしないのはなぜdefault=False
ですか?
class Foo(models.Models):
is_private = models.BooleanField(default=False)
もう1つ覚えておかなければならないのはrequest.POST['keyword']
、指定されたhtml name
属性によって識別される要素を参照することですkeyword
。
したがって、フォームが次の場合:
<form action="/login/" method="POST">
<input type="text" name="keyword" placeholder="Search query">
<input type="number" name="results" placeholder="Number of results">
</form>
次いで、request.POST['keyword']
及びrequest.POST['results']
入力要素の値を含むであろうkeyword
とresults
、それぞれ。
まず、リクエストオブジェクトに「is_private」キーパラメータがあるかどうかを確認します。ほとんどの場合、このMultiValueDictKeyErrorは、ディクショナリのようなリクエストオブジェクトにキーがないために発生しました。辞書は順不同のキーなので、値のペアは「連想記憶」または「連想配列」
言い換えれば。request.GETまたはrequest.POSTは、すべての要求パラメーターを含む辞書のようなオブジェクトです。これはDjangoに固有です。
get()メソッドは、キーが辞書にある場合、指定されたキーの値を返します。キーが使用できない場合、デフォルト値のNoneを返します。
このエラーは次のように入力して処理できます。
is_private = request.POST.get('is_private', False);
私にとって、このエラーは次の理由で私のdjangoプロジェクトで発生しました:
次のように、プロジェクトのテンプレートフォルダーにあるhome.htmlに新しいハイパーリンクを挿入しました。
<input type="button" value="About" onclick="location.href='{% url 'about' %}'">
views.pyでは、カウントと約について次の定義がありました。
def count(request):
fulltext = request.GET['fulltext']
wordlist = fulltext.split()
worddict = {}
for word in wordlist:
if word in worddict:
worddict[word] += 1
else:
worddict[word] = 1
worddict = sorted(worddict.items(), key = operator.itemgetter(1),reverse=True)
return render(request,'count.html', 'fulltext':fulltext,'count':len(wordlist),'worddict'::worddict})
def about(request):
return render(request,"about.html")
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.homepage,name="home"),
path('eggs',views.eggs),
path('count/',views.count,name="count"),
path('about/',views.count,name="about"),
]
いいえで見ることができるように。上記の3、最後のURLパターンでは、views.countを呼び出す必要があったのに対し、views.countを誤って呼び出していました。fulltext = request.GET['fulltext']
views.pyのcount関数のこの行(urlpatternのエントリが誤っているために誤って呼び出された)は、multivaluedictkeyerror例外をスローしました。
次に、urls.pyの最後のURLパターンを正しいものに変更しましたpath('about/',views.about,name="about")
。つまり、すべて正常に動作しました。
どうやら、一般的に、djangoの初心者プログラマーは、URLの別のビュー関数を誤って呼び出すことで犯した間違いを犯す可能性があります。これは、意図した動作ではなく、異なるパラメーターのセットを期待するか、レンダーコールで異なるオブジェクトのセットを渡す可能性があります。
これが初心者プログラマーのdjangoに役立つことを願って