困っていること
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/

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。