データベースにオブジェクトを保存しようとしていますが、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>)
あなたに最適なものを選択してください:
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 = 'is_private' in request.POST
または
is_private = 'is_private' in request.POST and request.POST['is_private']
使用している値に応じて。
モデルで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' %}'">
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.aboutを呼び出す必要があるのに対して、views.countを誤って呼び出していました。 views.pyのcount関数(urlpatternsのエントリが間違っているために誤って呼び出された)のこの行fulltext = request.GET['fulltext']
は、multivaluedictkeyerror例外をスローしました。
次に、urls.pyの最後のURLパターンを正しいパターン、つまりpath('about/',views.about,name="about")
に変更しましたが、すべて正常に機能しました。
明らかに、Djangoの初心者プログラマーは、URLの別のビュー関数を間違って呼び出したという間違いを犯す可能性があります。意図した動作ではなく。
これがDjangoの初心者プログラマに役立つことを願っています。