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

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

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

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

Python

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

HTML

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

解決済

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

mulberryfields
mulberryfields

総合スコア782

Google App Engine

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

Python

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

HTML

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

1回答

4評価

4クリップ

4371閲覧

投稿2015/12/06 13:11

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

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

python

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

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

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

How to get checkbox data using python on gae

しかし、

python

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

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

intを使わずに、

python

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

とすると、

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

というエラーが出ます。

python

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

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

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

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

html

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

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

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

python

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

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

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

###ソースコード

python

class Tags(ndb.Model): id = ndb.IntegerProperty(indexed=True) name = ndb.StringProperty(indexed=False) class Questions(ndb.Model): title = ndb.StringProperty(indexed = False) content = ndb.TextProperty(indexed = False) tag = ndb.StructuredProperty(Tags) tags = Tags.query().order(Tags.id) class MainPage(webapp2.RequestHandler): template_values = { 'tags':tags, } template = JINJA_ENVIRONMENT.get_template('index.html') self.response.write(template.render(template_values)) class Question(webapp2.RequestHandler): def post(self): question = Questions() question.title = self.request.get('title') question.tag = self.request.get_all('tag') question.content = self.request.get('content') question.put()

html

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

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

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

言語:Python

Google App Engine利用

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google App Engine

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

Python

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

HTML

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