概要
Djangoで、銀行からの借入金を管理するアプリを作っており、オートコンプリート機能について質問です。
新しい借り入れを登録するときに、Bankというテーブルから銀行を選択し、保存するようにしたいです。
Bankには、三菱東京銀行、三井住友銀行、みずほ銀行、りそな銀行、埼玉りそな銀行など、全国の金融機関名が登録済みです。
例えば、「りそな」と入力した時点で、「りそな銀行」「埼玉りそな銀行」が候補として選択可能になるようになっています。
現状、テキストを入れると候補が表示され、選択可能な状態です。
ただ最後に保存ボタンを押したときにエラーになってしまいます。
HTMLで選択した値をviews.py側で受けとって保存したいのですが、うまくいっていません。
現状
python
1(models.py) 2 3class Bank(models.Model): 4 name = models.CharField("金融機関名", max_length=31) 5 code = models.CharField('金融機関コード(4桁)', max_length=4) 6 7 8class Debt(models.Model): 9 bank = models.ForeignKey(Bank, on_delete=models.PROTECT) 10 date_issue = models.DateField("実行日", default=datetime.now) 11 principal = models.PositiveIntegerField("元本(円)", help_text="単位は日本円")
python
1(views.py) 2class DebtCreateView(CreateView): 3 model = Debt 4 form_class = DebtForm 5 success_url = reverse_lazy('myapp:debt_list') 6 7 def post(self, request): 8 form = DebtForm(request.POST) 9 #★↓↓↓ここをいろいろ試しています。↓↓↓ 10 selected_bank = Bank.objects.get(name = request.GET['banks']) 11 form.bank = selected_bank.id 12 #★↑↑↑ここをいろいろ試しています。↑↑↑ 13 14 if form.is_valid(): 15 debt = form.save(commit=False) 16 messages.success(request, '新しい借入を登録しました。') 17 debt.save() 18 form.save_m2m() 19 return redirect('myapp:debt_list') 20 else: 21 messages.error(request, 'エラーがあります。') 22 return redirect('myapp:debt_create') 23 24 return render(request, 'myapp/debt_list.html', {'form': form})
python
1(forms.py) 2 3class DebtForm(forms.ModelForm): 4 class Meta: 5 model = Debt 6 fields = ('date_issue', 'principal') 7 8 def __init__(self, *args, **kwargs): 9 super().__init__(*args, **kwargs) 10 for field in self.fields.values(): 11 field.widget.attrs['class'] = 'form-control'
HTML
1(debt_form.html) 2 3<input type="text" autocomplete="on" list="select_bank" name="banks"> 4<datalist id="select_bank"> 5{% for item in bank_list %} 6<option value="{{ item }}"> 7{% endfor %} 8</datalist>
試したこと
上記views.pyの「ここをいろいろ試しています。」の部分を次のように試してみました。
python
1form.bank = Bank.objects.filter(name = form.cleaned_data.get('banks'))
上記のエラー内容「'DebtForm' object has no attribute 'cleaned_data'」
python
1selected_bank = request.GET['banks'] 2selected_bank_object = Bank.objects.get(name = selected_bank) 3form.bank = selected_bank_object
上記のエラー内容「MultiValueDictKeyError at /debt_create」
ご教授いただければ幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。