清水と申します。 実際に再現したわけではありませんが、ぱっと見で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 にアクセスしてください。