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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2219閲覧

Django オートコンプリートでModelから選択した値をFormに引き継ぎ保存したい

ak_suzuki

総合スコア194

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/07/17 23:14

概要

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」

ご教授いただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。

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 selected_bank_object = Bank.objects.get(name = selected_bank) 12 #★↑↑↑ここでBankObjectを取得します。↑↑↑ 13 14 if form.is_valid(): 15 debt = form.save(commit=False) 16 #★↓↓↓ここで登録すべき値としてセットします。↓↓↓ 17 debt.bank = selected_bank_object 18 messages.success(request, '新しい借入を登録しました。') 19 debt.save() 20 form.save_m2m() 21 return redirect('myapp:debt_list') 22 else: 23 messages.error(request, 'エラーがあります。') 24 return redirect('myapp:debt_create') 25 26 return render(request, 'myapp/debt_list.html', {'form': form})

HTML

1(debt_form.html) 2#★↓↓↓value="{{ value ))をinputタグ内に追加↓↓↓ 3<input type="text" autocomplete="on" list="select_bank" name="banks" value="{{ value }}"> 4<datalist id="select_bank"> 5{% for item in bank_list %} 6<option value="{{ item }}"> 7{% endfor %} 8</datalist>

これで解決です。

投稿2019/07/21 06:53

ak_suzuki

総合スコア194

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問