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

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

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

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

Python

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

Q&A

解決済

1回答

1596閲覧

Django:HTMLの値をviews.pyに渡したい

teddy1121

総合スコア44

Django

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

Python

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

0グッド

0クリップ

投稿2022/04/02 04:42

編集2022/04/05 06:39

実現したいこと

info.htmlのテキストボックスに入った値をviews.pyに渡してデータベースに登録したいのですがパスのエラー?でinfo.htmlが開けません。
色々ググりましたが、viewsからhtmlへの情報は多いのですが、逆はあまり情報がなく行き詰まりました。
お助けいただけたら幸いです。
イメージ説明
※不要なファイルが多くてすみません…
ご回答いただいた後のイメージ
イメージ説明

発生している問題・エラーメッセージ

NoReverseMatch at /info Reverse for 'views.py' not found. 'views.py' is not a valid view function or pattern name.

該当のソースコード

html

1<form action="{% url 'views.py' %}" method="post"> 2 {% csrf_token %} 3 <div class="field"> 4 <input type="text" id="IDcol" name="IDcolName" class="IDcolName" /> 5 </div> 6 <input type="submit" value="送信"> 7 </form>

views.py

1def get_id(request): 2 if request.method =="POST": 3 attId = request.POST['IDcolName'] 4 print(attId) 5 template_name = "backend/info.html" 6 params = { 7 "attendId": attId, 8 } 9 return render(request, 'info.html',params)

urls.py

1from django.urls import path 2from django.conf.urls import url 3from backend import views 4from . import views 5 6app_name = 'backend' 7urlpatterns = [ 8path('info', views.info, name='info'), 9path('', views.get_id, name='info'), 10 11 12]

views.py(修正後)

1def get_id(request): 2 if request.method =="POST": 3 attId = request.POST['IDcolName'] 4 # データベースに接続します 5 conn_str = ( 6 r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' 7 r'DBQ=C:\Users\〇〇\Desktop\sougoudb.accdb;' 8 ) 9 conn = pyodbc.connect(conn_str) 10 11 curs = conn.cursor() 12 13 curs.execute("INSERT INTO 英語(顧客ID) VALUES ('1')") 14 params = { 15 "attendId": attId, 16 } 17 return render(request, 'backend/get_id.html', {'params': params})

views.py(access接続)

1def info(request): 2 3 request.method == 'POST' 4 userid = request.POST['koushaId'] 5 kshaname = request.POST['koushaName'] 6 7 # データベースに接続します 8 conn_str = ( 9 r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' 10 r'DBQ=C:\Users\〇〇\Desktop\sougoudb.accdb;' 11 ) 12 conn = pyodbc.connect(conn_str) 13 14 curs = conn.cursor() 15 gakunen = conn.cursor() 16 kokyaku = conn.cursor() 17 18 curs.execute("SELECT クラスweb,クラス名 FROM クラステーブル WHERE 無効フラグ = false") 19 docs = curs.fetchall() 20 21 gakunen.execute("SELECT 学年ID,学年名 FROM 学年名テーブル") 22 gkn = gakunen.fetchall() 23 24 25 kokyaku.execute("SELECT * FROM 基本情報 WHERE kshaID = \'%s\'" % userid) 26 kj = kokyaku.fetchall() 27 28 context = { 29 30 'ksha':kshaname, 31 'id':userid, 32 'doc':docs, 33 'gakunen':gkn, 34 'kokyaku':kj, 35 } 36 return render(request, 'backend/info.html',context)

試したこと

info.htmlのaction部分を見様見真似で「backend:views」「templates/views.py」「backend/templates/views」などしてみましたがダメでした。
もしかしたら実現したいことと手法が違うのではないかとも思っています。
より良い方法などありましたら併せて教えて頂けたら嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じで書くとどうでしょう。

html:(info.html)

1<form action="/get_id" method="post"> 2 {% csrf_token %} 3 <div class="field"> 4 <input type="text" id="IDcol" name="IDcolName" class="IDcolName" /> 5 </div> 6 <input type="submit" value="送信"> 7</form>

python:(views.py)

1def get_id(request): 2 if request.method =="POST": 3 attId = request.POST['IDcolName'] 4 params = { 5 "attendId": attId, 6 } 7 return render(request, 'get_id.html', {'params': params})

html:(get_id.html)

1<h2>get_id</h2> 2 3<p>{{ params.attendId }}</p>

python:(urls.py)

1from django.urls import path 2from django.conf.urls import url 3from backend import views 4from . import views 5 6app_name = 'backend' 7urlpatterns = [ 8 path('info', views.info, name='info'), 9 path("get_id", views.get_id), 10]

DBへの登録に関しては以下の記事が参考になりそうです。
https://mizzsugar.hatenablog.com/entry/2018/06/25/230630

投稿2022/04/02 13:07

consel

総合スコア74

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

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

teddy1121

2022/04/04 05:33

返信が遅くなり大変申し訳ありません。 参考付のご丁寧な回答ありがとうございます。 頂いたコードをコピペしたところ、get_idのpagenotfoundが発生しました。 form action="/get_id" method="post"の部分だとは思うのですが、フルパスや「backend/get_id」などやほかのページを参考に「"{% url 'backend:get_id' %}"」などとしてもダメでした。 get_id.htmlを作る場所が違ったりしますか? get_idを作った後の画像を添付しますのでご指摘いただけたら幸いです。
teddy1121

2022/04/04 05:44

あと記述忘れしていたのですが、保存したいデータベースはMSAccessです。 views.pyにてpyodbを使ってAccessのテーブルからデータを呼び出すことはできています。 書き込みではINSERT INTOを使えばいいかと思っていますがその際はviews.pyにデータを渡した置かないといけないのかなとは思っています。 そのあたりもアドバイスいただけたら幸いです。
teddy1121

2022/04/04 08:55

notfoundについて自己解決しました。 views.pyの最後を以下のように変更したところget_idが開きました。 return render(request, 'backend/get_id.html', {'params': params}) MSAccessへの登録について引き続き教えて頂けたら幸いです。
consel

2022/04/04 11:20

> その際はviews.pyにデータを渡した置かないと - フォームに入力されたデータをDBに登録したい。 - そのためにDBに入れるデータをviews.pyに渡したい。 ということかと思いますが、 そうでしたらフォームを新たに追加すると良いのではないでしょうか。 (やりたいことが違ってましたらおっしゃってください) ``` html:(info.html) <form action="/get_id" method="post"> {% csrf_token %} <div class="field"> <input type="text" id="IDcol" name="IDcolName" class="IDcolName" placeholder="ID"/> <input type="text" id="VALUEcol" name="VALUEcolName" class="VALUEcolName" placeholder="VALUE"/> </div> <input type="submit" value="送信"> </form> ``` ``` python:(views.py) def get_id(request): if request.method =="POST": attId = request.POST['IDcolName'] attValue = request.POST['VALUEcolName'] params = { "attendId": attId, "attendValue": attValue, } return render(request, 'get_id.html', {'params': params}) ```
teddy1121

2022/04/05 02:48

お忙しい中ご返答ありがとうございます。 私の知識不足なのですが、MSAccessへの登録の場合、 html→views→accessの順で値が動くのかと思っていました。 そこで、追記したようにpyodbでaccessへ接続し、 curs.execute("INSERT INTO 英語(顧客ID) VALUES ('1')") のようにして書き込めばいいのかと思ったのですが上手くいきませんでした。 教えて頂いたコードですと、info.htmlのフォームに入力された値をget_id.htmlに書き出すのかなと思うのですが、どこでaccessに接続したらいいのかわかりませんでした。 勉強不足の上でのお願いで恐縮ですが、ご教授いただけたら幸いです。
consel

2022/04/05 04:27

> どこでaccessに接続したらいいのかわかりませんでした。 なるほどです。データ取得はできるけどinsertができないというのが今の課題ですね。 get_id.htmlは、フォームに入力した値がviews.pyに渡ってきてるよという確認用のhtmlなのでこれは無視していただいて大丈夫です!笑 > views.pyにてpyodbを使ってAccessのテーブルからデータを呼び出すことはできています。 SELECTでのデータ取得はできているとお見受けしますが、 よろしければ呼び出しているところのコードって見せていただくこと可能でしょうか。
teddy1121

2022/04/05 06:41

get_idは確認用だったのですね^^; データを取得している部分のコードをアップしました。 この部分でMSAccessのテーブルに接続し、SELECT文で各データを取得してinfo.htmlに送信しています。 いかがでしょうか?
consel

2022/04/05 13:42 編集

すみません、自分の環境がMacで上手くpyodbが導入できなかったので力になれないかもしれないです。 後考えられる原因としては - executeの後にconn.commit()をしていない くらいかなと思います
teddy1121

2022/04/06 01:06

conselさん、できました! mac環境なのにわざわざ試して頂いてありがとうございます! executeしてもcommitしないと確定されないのですね。 これでほかの部分でも応用できるため本当に助かりました! 長時間お付き合い頂きありがとうございました! また何かありましたらよろしくお願い致します!
consel

2022/04/06 11:19

動作したようで良かったです! 引き続きよろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問