###前提・実現したいこと
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利用
長文で分かりづらいかと思いますが、申し訳ありません。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/07 00:33
2015/12/07 00:38
退会済みユーザー
2015/12/07 11:35
退会済みユーザー
2015/12/07 13:01
2015/12/08 01:02
退会済みユーザー
2015/12/08 01:15