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

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

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

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

Python

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

Q&A

解決済

3回答

1997閲覧

フォームで入力したデータが、htmlタグ付きで処理されてしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2015/08/16 15:06

Djangoを使って、webフォーム処理をする仕組みを作ろうと思いました。
単純に、フォーム上に入力されたデータをデータベースに登録するだけのものです。

python

1class Answer(models.Model): 2 answer = models.TextField() 3 def __unicode__(self): 4 return self.answer

python

1#forms.py 2# -*- coding: utf-8 -*- 3from django import forms 4 5class AnswerForm(forms.Form): 6 answer = forms.CharField(label = u"あなたの回答",widget=forms.Textarea)

上記のforms.pyを元にviews.pyを通してhtmlにレンダリングしていますが、ここはうまく動作しているので、記載を割愛します。

python

1#views.py 2def answer(request): 3 if request.method == 'POST': 4 f = AnswerForm(request.POST) 5 if f.is_valid(): 6 rec_answer = f['answer'] 7 rec = Answer(answer=rec_answer) 8 rec.save()

出来上がった入力ページのフォーム部分は、下記のようになっています。

html

1 <tr><th><label for="id_answer">あなたの回答:</label></th> 2<td><textarea cols="40" id="id_answer" name="answer" rows="10"></textarea></td></tr>

このフォームに、例えば、「こんにちは。」と入力して、submitすると、
<textarea cols="40" id="id_answer" name="answer" rows="10"> こんにちは。</textarea>
というデータが登録されてしまいます。

どうしてhtmlタグまで一緒についてきてしまうのでしょうか。
どう修正したらよいかお分かりの方、ご教示いただけないでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Kompiroさんの言うようにModelFormを継承してフォームを作ったら

Python

1def answer(request): 2 if request.method == 'POST': 3 f = AnswerForm(request.POST) 4 if f.is_valid(): 5 f.save()

だけで保存されると思います。
f["answer"]だとフォームのanswer(今回はtextarea)をとってくるので、
textareaのhtml表現が入ってしまうのだと思います。

投稿2015/08/18 16:53

kokardy

総合スコア781

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

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

退会済みユーザー

退会済みユーザー

2015/08/22 12:38

ありがとうございます。お礼が遅くなり申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2015/08/22 12:46

ご指摘の方法で、うまく行きました。
guest

0

Python

1if f.is_valid(): 2 rec_answer = f['answer'].value() 3 rec = Answer(answer=rec_answer) 4 rec.save()

でもいけるとは思いますが、is_validでバリデーションをチェックしてるなら

Python

1if f.is_valid(): 2 rec_answer = f.cleaned_data['answer'] 3 rec = Answer(answer=rec_answer) 4 rec.save()

とするのが一般的かと思います。

投稿2015/08/21 15:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/08/22 12:45 編集

ありがとうございます。 cleaned_dataを使うことでフォームを安全に処理できるのですね。
guest

0

すみません。Djangoはあまり詳しくないです。ごめんなさい。

Python

1class AnswerForm(forms.Form): 2 answer = forms.CharField(label = u"あなたの回答",widget=forms.Textarea)

ですが、forms.Formを継承するのではなく、Formなので、ModelFormを継承するのではないでしょうか?
それと、フィールドもformsから作成したものでなくて、モデルそのものを利用するのでは?

たぶん下記のようなコードだと思います。

Python

1# forms.py 2from django.forms import ModelForm 3from ??? import Answer 4 5class AnswerForm(ModelForm): 6 class Meta: 7 model = Answer 8 fields = ('answer')

参考: モデルの一部のフィールドだけからフォームを生成する

投稿2015/08/16 17:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/08/17 12:18

ご回答頂き、ありがとうございますm(__)m 記載頂いた方法でも、フォームを作成し、投稿することができました。 (fields = ('answer',)という形で、'answer'の後にカンマを入れる必要はありました。) ただ、あいかわらず、 「こんにちは。」と入力して、submitすると、 「 <textarea cols="40" id="id_answer" name="answer" rows="10"> こんにちは。</textarea>」 と登録されてしまう現象は出てしまいます。 おそらく、フォームの作成に問題があるのではなく、views.pyのどこかに誤りがあるのだと思います。 なお、私のフォームの書き方は、 http://django-docs-ja.readthedocs.org/en/latest/topics/forms/#id3 等を参考にしたものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問