清水さん お世話になります。原です。
ご指摘ありがとうございます。 確かにおっしゃる通り・・・POST処理なのでrequest.GET[]は間違いでしたね・・・・ すべてrequest.POST["****"]に変更するとこで問題なくデータ登録できるようになりました。 ありがとうございました! 2018年2月9日金曜日 10時29分07秒 UTC+9 Shimizu N.: > > 清水と申します。 > 実際に再現したわけではありませんが、ぱっと見でviews.pyのこの部分。 > > > def form_test2(request): > > if request.method == "POST": > > form = ServerInfoForm(request.POST) > > if form.is_valid(): > > serverinfo = form.save(commit=False) > > serverinfo.environment_id = request.GET["environment"] > →ここでエラーになっているっぽい。 > > serverinfo.server_name = request.GET["server_name"] > > ... > > > POST処理なのでここは「request.GET["environment"]」ではなく「request.POST["environment"]」でOKなような気がしますがいかがでしょう? > > 2018年2月8日木曜日 23時01分39秒 UTC+9 sinf...@gmail.com: >> >> 当方Django初心者で以下のエラーで悩んでおります。 >> >> Formを用いたデータ登録処理にて「MultiValueDictKeyError」エラーが発生して >> 登録処理ができない状態です。 >> >> <データ登録画面の概要> >> /form_test2にアクセスすると以下のような登録画面が表示されるので、 >> 情報を入力してSaveボタンを押すと上記エラーが発生する。 >> >> ------------------------------------------------------------ >> Envirnment: PROD,TEST,DEVの3つから選択 >> ServerName: 任意の文字列を入力 >> OS_version : リストから値を選択 >> CPU: 数値を入力 >> MEMORY:数値を入力 >> ------------------------------------------------------------ >> >> >> エラーが発生している部分がviews.py内の以下の箇所です。 >> >> serverinfo.environment_id = request.GET["environment"] >> >> envrinmentはモデルで定義されているクラスServerInfo内の項目ですが、 >> Envrinemtクラスを参照するForeignKeyになっています。 >> >> ServerInfoクラスのテーブルデータ内容 >> id os_version cpu memory environment_id >> server_name >> ---------- ---------- ---------- --------- - -------------- >> ----------- >> 2 2012NR 21 129 1 >> server01 >> 3 2012NR 5 5 2 >> server02 >> >> Environmentクラスのテーブルデータ内容 >> id env_value >> ---------- ---------- >> 1 PROD >> 2 TEST >> 3 DEV >> >> 以下、URL,フォーム、ビュー、モデル等関連する部分の情報になります。 >> ==================================================================== >> models.py >> ==================================================================== >> class Environment(models.Model): >> class Meta: >> verbose_name = '環境種別' >> verbose_name_plural = '環境種別' >> >> env_value = models.CharField(max_length=20) >> >> def __str__(self): >> return self.env_value >> >> class ServerInfo(models.Model): >> >> class Meta: >> verbose_name = 'サーバ情報' >> verbose_name_plural = 'サーバ管理情報' >> >> OS_VERSIONS = ( >> ('2012NR', 'WindowsServer2012'), >> ('2012SR2', 'WindowsServer2012R2'), >> ('2016NR', 'WinodwsServer2016NR'), >> ) >> >> environment = models.ForeignKey(Environment, on_delete=models.CASCADE) >> server_name = models.CharField(max_length=50, unique=True) >> os_version = models.CharField(max_length=50,choices=OS_VERSIONS) >> cpu = models.IntegerField(default=1, help_text="単位はGB") >> memory = models.IntegerField(default=1, help_text="単位はGB") >> #@classmethod >> def __str__(self): >> return self.server_name >> =============================================================== >> >> >> ====================================================================== >> views.py >> =============================================================== >> def form_test2(request): >> if request.method == "POST": >> form = ServerInfoForm(request.POST) >> if form.is_valid(): >> serverinfo = form.save(commit=False) >> serverinfo.environment_id = request.GET["environment"] >> →ここでエラーになっているっぽい。 >> serverinfo.server_name = request.GET["server_name"] >> serverinfo.os_version = request.GET["os_version"] >> serverinfo.cpu = request.GET["cpu"] >> serverinfo.memory = request.GET["memory"] >> serverinfo.save() >> return redirect(detail, pk=serverinfo.pk) >> else: >> form = ServerInfoForm() >> return render(request, 'form_test.html', {'form': form}) >> ====================================================================== >> ====================================================================== >> urls.py >> ====================================================================== >> <関係する部分のみ抜粋> >> url(r'^form_test2$', views.form_test2,name='form_test2'), >> ====================================================================== >> >> >> ====================================================================== >> Form.py >> ====================================================================== >> from django import forms >> from .models import ServerInfo >> >> class ServerInfoForm(forms.ModelForm): >> class Meta: >> model = ServerInfo >> fields =("environment","server_name","os_version","cpu","memory") >> >> ====================================================================== >> >> ====================================================================== >> form_test.html >> ====================================================================== >> >> {% extends 'base.html' %} >> >> {% block content %} >> <H1>FORM画面テスト</H1> >> >> <form method="POST" class="post-form">{% csrf_token %} >> {{ form.as_p }} >> <button type="submit" class="save btn btn-default">Save</button> >> </form> >> {% endblock content %} >> >> >> おそらく、テンプレートに入力されたEnvirnmentの値(PROD,TEST,DEV)を受け取ってデータベースに >> 登録するときに正しい情報を渡せていないからだと思いますが、具体的にどのように修正すればエラーが >> 改善するのかいまいちわかりません。 >> >> 以上、ご教授よろしくお願いいたします。 >> > -- ----------------- http://djangoproject.jp/ ----------------- You received this message because you are subscribed to the Google Groups "django-ja" group. To post to this group, send email to django-ja@googlegroups.com To unsubscribe from this group, send email to django-ja-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-ja --- このメールは Google グループのグループ「django-ja」の登録者に送られています。 このグループから退会し、グループからのメールの配信を停止するには django-ja+unsubscr...@googlegroups.com にメールを送信してください。 その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。