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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Google App Engine

Google App Engineは、Googleの管理するデータセンター上でウェブアプリケーションの開発が可能なクラウドコンピュータ技術です。Java、Python、Go用にSDKが用意されています。

Python

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

HTML

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

Q&A

解決済

1回答

4822閲覧

checkboxの複数データを処理できない

退会済みユーザー

退会済みユーザー

総合スコア0

Google App Engine

Google App Engineは、Googleの管理するデータセンター上でウェブアプリケーションの開発が可能なクラウドコンピュータ技術です。Java、Python、Go用にSDKが用意されています。

Python

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

HTML

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

4グッド

4クリップ

投稿2015/12/06 13:11

###前提・実現したいこと
Google App Engine(Python)で、質問投稿サイトを作成しています。
ユーザーには、質問投稿時にフォーム上のcheckboxで複数のタグを選んでもらいます。
選んでもらったタグをデータベースに登録したいです。
(teratailのタグのようなものです。)

###発生している問題・エラーメッセージ
当初、checkboxで入力されたタグを取得するために、下記のようにしていました。

python

1question.tag = int(self.request.get('tag')

しかし、getでは、複数タグを選択された場合に、1つしか取ってこないという問題がありました。

調べてみると、checkboxで選択された複数項目を取ってくるためには、get_allを使えば良いということです。

How to get checkbox data using python on gae

しかし、

python

1question.tag = int(self.request.get_all('tag'))

とすると、
TypeError: int() argument must be a string or a number, not 'list'
となります。get_allは、リストとして取ってくるので、intを使えないということです。

intを使わずに、

python

1question.tag = self.request.get_all('tag')

とすると、

BadValueError: Expected Tags instance, got [u'1']

というエラーが出ます。

python

1class Tags(ndb.Model): 2 id = ndb.IntegerProperty(indexed=True) 3 name = ndb.StringProperty(indexed=False)

タグを扱うTagsモデルは、idをIntegerPropertyとしているので、送信されてきたgot[u'1]が数字になっていないというエラーになっています。

一番ありがたい解決方法は、checkboxのvalueの値が、文字列ではなく、数字として渡されてこれば良いのだと思いますが、どうしても文字列になってしまいます。

なお、Pythonで処理されて吐き出されたHTMLは、下記のようになっています。

html

1<input type="checkbox" name="tag" value=1>A/ 2<input type="checkbox" name="tag" value=2>B/ 3<input type="checkbox" name="tag" value=3>C/

そのため、valueは数字として扱ってもらえるのではないかと思っていたのですが、そうはなっていないようです。
checkboxのvalueの値が、「u'1'」という文字列ではなく、数字として渡されるようにする方法があるのであれば、それで解決できると思うので、その方法を知りたいです。

ちなみに、タグを扱うTagsモデルを、

python

1class Tags(ndb.Model): 2 id = ndb.StringProperty(indexed=True) 3 name = ndb.StringProperty(indexed=False)

とし、idをStringPropertyとすると、
BadValueError: Expected Tags instance, got [u'1']
というエラーが出ます。

どこをどう変えたら、うまくいくでしょうか。

###ソースコード

python

1class Tags(ndb.Model): 2 id = ndb.IntegerProperty(indexed=True) 3 name = ndb.StringProperty(indexed=False) 4 5class Questions(ndb.Model): 6 title = ndb.StringProperty(indexed = False) 7 content = ndb.TextProperty(indexed = False) 8 tag = ndb.StructuredProperty(Tags) 9 10tags = Tags.query().order(Tags.id) 11 12class MainPage(webapp2.RequestHandler): 13 template_values = { 14 'tags':tags, 15 } 16 template = JINJA_ENVIRONMENT.get_template('index.html') 17 self.response.write(template.render(template_values)) 18 19class Question(webapp2.RequestHandler): 20 def post(self): 21 question = Questions() 22 question.title = self.request.get('title') 23 question.tag = self.request.get_all('tag') 24 question.content = self.request.get('content') 25 question.put()

html

1<!--index.html--> 2<form action="" method="post" accept-charset="utf-8"> 3{% for tag in tags %} 4 <input type="checkbox" name="tag" value={{tag.id}}>{{tag.name}}/ 5{% endfor %} 6<input name ="title" size=100% maxlength="130" type="text"> 7<textarea cols=100% name="content" rows="13" placeholder="質問内容"></textarea> 8<button class"btn btn-default" type="submit">submit</button> 9</form>

###補足情報(言語/FW/ツール等のバージョンなど)
Webフレームワーク:webapp2

テンプレートエンジン:Jinja2

言語:Python

Google App Engine利用

長文で分かりづらいかと思いますが、申し訳ありません。
よろしくお願いいたします。

yterpu, TmNm_Bigger, av-👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1question.tag = Tags( id=int(self.request.get_all('tag')[0] )

とりあえずこれでエラーは出なくなると思いますが…… 『複数タグを選択された場合』はどう処理するおつもりでしたか? repeated property にしなくてもよかったんでしょうか?

投稿2015/12/07 00:31

編集2015/12/07 00:39
Lhankor_Mhy

総合スコア36905

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

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

Lhankor_Mhy

2015/12/07 00:33

ああ、違う。StructuredPropertyなのか……
退会済みユーザー

退会済みユーザー

2015/12/07 11:35

ご回答ありがとうございます。 ご指摘の方法でエラーは出なかったのですが、複数のcheckboxを選んだ場合、そのうちの一つしか持って来なくなってしまいます。どうしたらよいでしょうか?
退会済みユーザー

退会済みユーザー

2015/12/07 13:01

とりあえず、 class Questions(ndb.Model): ..... tag = ndb.StringProperty(repeated=True) .... class Question(webapp2.RequestHandler): def post(self): .... question.tag = self.request.get_all('tag') .... とすることで、文字列ではありますが、複数のタグのidを取得し保存するところまでは、できました。
Lhankor_Mhy

2015/12/08 01:02

ご質問は解決ということでよろしいですか?
退会済みユーザー

退会済みユーザー

2015/12/08 01:15

ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問