質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

解決済

MultiValueDictKeyErrorとは?

SyunSyun
SyunSyun

総合スコア24

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

1回答

0評価

0クリップ

14904閲覧

投稿2019/12/19 21:12

編集2019/12/20 01:03

勉強をかねて簡単なブログを作成している途中のDjango初心者です。
記事の検索機能を追加している最中にMultiValueDictKeyErrorとでました。
blog/post_list.html で<input type="submit" value="Search">と指定されたserchボタンを出力画面上で押すとMultiValueDictKeyErrorの画面に飛ばされます。
このエラーの意味と下記のコードの何に原因があるかもしお気付きの点あればご教授お願い致します。
urls.py

from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('find/', views.find, name='find'), ]

views.py

from django.shortcuts import redirect from django.shortcuts import render from .models import Post from .forms import PostForm from django.core.paginator import Paginator from .forms import FindForm def index(request, num=1, pk=1): posts = Post.objects.order_by('published_date').reverse() page = Paginator(posts, 3) num2 = Post.objects.all().count() params = { 'data': page.get_page(num), 'num2' : num2, '' : pk } return render(request, 'blog/post_list.html', params) def find(request, num=1): if request.method == 'POST': form = FindForm(request.POST) str = request.POST['find'] data = Post.objects.filter(name=str) num2 = data.count() page = Paginator(data, 3) params = { 'data' : page.get_page(num), 'num2' : num2, } return render(request, 'blog/post_list.html', params) else: return redirect('index')

blog/post_list.html

{% extends 'blog/base.html' %} {% block content %} <p class='artticle_num'>記事数:{{ num2 }}</p> <div> <form action="{% url 'find' %}" method="post"> {% csrf_token %}{{form}} <input type="submit" value="Search"> </form> </div> {% for post in data %} <div class="post"> <div class="date"> {{ post.published_date }} <div> 投稿者:{% if user.username == 'TARO' %}夫     {% elif user.username == 'HANAKO' %}妻     {% else %}長女     {% endif %} </div> </div> <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2> <p>{{ post.sub_title}}</p> <p>{{ post.text|linebreaksbr }}</p> </div> {% endfor %} <div class="pagination"> {% if data.has_previous %} <a href="{% url 'index' %}">&laquo;First</a> <a href="{% url 'index' %}{{data.previous_page_number}}">&laquo;Prev</a> {% endif %} <span class="current"> [{{data.number}}/{{data.paginator.num_pages}}] </span> {% if data.has_next %} <a href="{% url 'index' %}{{data.next_page_number }}">Next&raquo;</a> <a href="{% url 'index' %}{{data.paginator.num_pages }}">Last&raquo;</a> {% endif %} </div> {% endblock %}

forms.py

from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model = Post fields = ('title', 'sub_title', 'text') class FindForm(forms.Form): find = forms.CharField(label='記事を検索する', required = False)

models.py

from django.conf import settings from django.db import models from django.utils import timezone class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) title = models.CharField(max_length=200) sub_title = models.CharField(max_length=100) text = models.TextField() created_date = models.DateTimeField(default=timezone.now) published_date = models.DateTimeField(blank=True, null=True) def publish(self): self.published_date = timezone.now() self.save()

エラー表示は以下の通りです。
イメージ説明

イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

azuapricot

2019/12/20 00:26

エラーメッセージを提示して下さい。 画面に原因箇所表示されてませんか?
SyunSyun

2019/12/20 01:04

お返事ありがとうございます。 エラーメッセージを追加しました。 str = request.POST['find']が問題なのでしょうか?
azuapricot

2019/12/20 01:13

POSTからとりたいなら、 request.POST.get('find') じゃないですか?
SyunSyun

2019/12/20 02:09

解決しました!!! 昨日も助けて頂いてありがとうございます。 今後もよろしくお願いいたします。 また回答にコメント頂けると、ベストアンサーに選びやすです。 お時間あるときにお願いいたします。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。