web-dev-qa-db-ja.com

django MultiValueDictKeyErrorエラー、対処方法

データベースにオブジェクトを保存しようとしていますが、MultiValueDictKeyErrorエラーがスローされています。

問題はフォーム内にあり、is_privateはチェックボックスで表されます。チェックボックスが選択されていない場合、明らかに何も渡されません。ここでエラーが発生します。

この例外を適切に処理してキャッチするにはどうすればよいですか?

行は

is_private = request.POST['is_private']
145
dotty

MultiValueDictのgetメソッドを使用します。これは標準の辞書にも存在し、値が存在しない場合にデフォルトを提供しながら値を取得する方法です。

is_private = request.POST.get('is_private', False)

一般的に、

my_var = dict.get(<key>, <default>)
237
adamnfish

あなたに最適なものを選択してください:

1

is_private = request.POST.get('is_private', False);

is_privateキーがrequest.POSTに存在する場合、is_private変数はそれに等しくなり、そうでない場合はFalseになります。

2

if 'is_private' in request.POST:
    is_private = request.POST['is_private']
else:
    is_private = False

3

from Django.utils.datastructures import MultiValueDictKeyError
try:
    is_private = request.POST['is_private']
except MultiValueDictKeyError:
    is_private = False
68
Silver Light

辞書がない場合にキーを辞書から取得しようとしているので、それを取得します。最初にそこにあるかどうかをテストする必要があります。

試してください:

is_private = 'is_private' in request.POST

または

is_private = 'is_private' in request.POST and request.POST['is_private']

使用している値に応じて。

10
Joe

モデルでis_privatedefault=Falseとして定義しようとしなかったのはなぜですか?

class Foo(models.Models):
    is_private = models.BooleanField(default=False)
5
Edson Dota

覚えておくべきもう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の値が含まれます。

2
Leo

最初に、リクエストオブジェクトに「is_private」キーパラメータがあるかどうかを確認します。ケースのこのMultiValueDictKeyErrorのほとんどは、ディクショナリのようなリクエストオブジェクトのキーが見つからないために発生しました。辞書は順序付けられていないキーであるため、値のペア「連想メモリ」または「連想配列」

別の言葉で。 request.GETまたはrequest.POSTは、すべての要求パラメーターを含む辞書のようなオブジェクトです。これはDjangoに固有です。

メソッドget()は、キーが辞書にある場合、指定されたキーの値を返します。キーが利用できない場合、デフォルト値Noneを返します。

次のように入力することで、このエラーを処理できます。

is_private = request.POST.get('is_private', False);
0
Projesh Bhoumik

私にとって、このエラーはDjangoプロジェクトで次の理由で発生しました。

  1. 次のように、プロジェクトのテンプレートフォルダーにあるhome.htmlに新しいハイパーリンクを挿入しました。

    <input type="button" value="About" onclick="location.href='{% url 'about' %}'">
    1. Views.pyでは、countと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")

    1. Urls.pyには、次のURLパターンがありました。

    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の初心者プログラマに役立つことを願っています。

0
TNT