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

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

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

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

Q&A

解決済

1回答

635閲覧

更新する画面で、新規登録時に選択したプルダウンの項目を表示したい

mr.aruru

総合スコア11

Django

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

0グッド

0クリップ

投稿2022/07/22 02:52

困っていること

djangoで、ロットを管理するシステムを作成しています。
masterとlotの2つのモデルがあり、masterには商品情報が入っています。
ロットを入力する画面で、商品を選択する際にプルダウンを実装しています。
新規登録時はプルダウンで商品を選択し、DBに選択したitemidが書きこまれるのですが、更新画面時には、itemidの値は取得できるものの、プルダウンに選択した商品が表示されず、困っております。
色々なサイトを見て調べた結果、formで、initialに指定すれば表示できることが分かったのですが、更新画面で表示させるには、どのようにデータを渡せばよいのか、その記述方法が分かりません。
よろしくお願いします。

該当のソースコード

views.py

1from django.shortcuts import render, redirect,get_object_or_404 2from django.urls import reverse_lazy 3from .models import master,lot 4from .forms import LotInputForm 5 6def CreateLotView(request): 7 params = {'message': '', 'form': None} 8 if request.method == 'POST': 9 form = LotInputForm(request.POST) 10 if form.is_valid(): 11 form.save() 12 return redirect('list_lot') 13 else: 14 params['form'] = form 15 else: 16 params['form'] = LotInputForm() 17 return render(request, 'lot/lot_create.html', params) 18 19def UpdateLotView(request,lotid): 20 obj = get_object_or_404(lot,pk=lotid) 21 if request.method == 'POST': 22 form = LotInputForm(request.POST) 23 params = {"form": form} 24 params["object"] = obj 25 if form.is_valid(): 26 form.save() 27 return redirect('list_lot') 28 else: 29 params['form'] = form 30 else: 31 form = LotInputForm(request.POST) 32 params = {"form": form} 33 params["object"] = obj 34 return render(request, 'lot/lot_update.html', params)

forms.py

1from django import forms 2from .models import master,lot,Management_data,User_data 3 4class MasterChoiceField(forms.ModelChoiceField): 5 def label_from_instance(self, obj): 6 return str(obj.itemid) + ':' + obj.kbn + '(' + obj.type_name + ') 7 8class LotInputForm(forms.ModelForm): 9 itemid = MasterChoiceField(queryset=master.objects.all()) 10 11 def __init__(self, *args, **kwargs): 12 super(LotInputForm, self).__init__(*args, **kwargs) 13 for field in self.fields.values(): 14 field.widget.attrs["class"] = "form-control" 15 self.fields['itemid'].widget.attrs["class"] = "form-select" 16 17 class Meta: 18 model = lot 19 fields = ('lotid','itemid','purchase_date','delivery_date','price','purchase_number','shopname')

template.html

1{% extends 'base.html' %} 2 3{% block title %}購入ロット登録{% endblock title %} 4 5{% block content %} 6 7 <form method='POST'> 8 {% csrf_token %} 9 <div class="container"> 10 <div class="row justify-content-center"> 11 <div class="col-5"> 12 13 <div class="row mb-4 form-group"> 14 <div class="col-7"><h2>購入ロット登録</h2></div> 15 </div> 16 17 <div class="row mb-2 form-group"> 18 <label class="col-form-label col-2" for="lotid">LOTID</label> 19 <div class="col-3"><input type="text" class="form-control" id="lotid" name="lotid" disabled value={{object.lotid}}></div> 20 </div> 21 22 <div class="row mb-2 form-group"> 23 <label class="col-form-label col-2" for="itemid">ItemID</label> 24 <div class="col-8">{{ form.itemid }}</div> 25 </div> 26 27 --- << 省略 >> --- 28 29 </div> 30 </div> 31 </div> 32 </form> 33{% endblock content %}

試したこと

forms.pyの下記にinitialを設定。
itemid = MasterChoiceField(queryset=master.objects.all(),initial=itemid)

参考にしたサイト

https://noumenon-th.net/programming/2019/11/07/django-modelform/

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

色々と調べたことにより、forms.pyばかりに気を取られていましたが、views.pyでlotidをフォームに渡していないことが分かりました。

if request.method == 'POST':
form = LotInputForm(request.POST ,instance=lotid)

--- << 省略 >> ---

else:
form = LotInputForm(request.POST instance=lotid)

--- << 省略 >> ---

投稿2022/07/22 04:46

mr.aruru

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問