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

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

ただいまの
回答率

87.78%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,619

score 809

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

class Answer(models.Model):
    answer = models.TextField()
    def __unicode__(self):
    return self.answer

#forms.py
# -*- coding: utf-8 -*-
from django import forms

class AnswerForm(forms.Form):
    answer = forms.CharField(label = u"あなたの回答",widget=forms.Textarea)
上記のforms.pyを元にviews.pyを通してhtmlにレンダリングしていますが、ここはうまく動作しているので、記載を割愛します。

#views.py
def answer(request):
    if request.method == 'POST':
    f = AnswerForm(request.POST)
    if f.is_valid():
        rec_answer = f['answer']
        rec = Answer(answer=rec_answer)
        rec.save()

出来上がった入力ページのフォーム部分は、下記のようになっています。
 <tr><th><label for="id_answer">あなたの回答:</label></th>
<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タグまで一緒についてきてしまうのでしょうか。
どう修正したらよいかお分かりの方、ご教示いただけないでしょうか。
よろしくお願いいたします。 

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

Kompiroさんの言うようにModelFormを継承してフォームを作ったら
def answer(request):
    if request.method == 'POST':
        f = AnswerForm(request.POST)
        if f.is_valid():
            f.save()
だけで保存されると思います。
f["answer"]だとフォームのanswer(今回はtextarea)をとってくるので、
textareaのhtml表現が入ってしまうのだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/22 21:38

    ありがとうございます。お礼が遅くなり申し訳ございませんでした。

    キャンセル

  • 2015/08/22 21:46

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

    キャンセル

0

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

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

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

たぶん下記のようなコードだと思います。
# forms.py
from django.forms import ModelForm
from ??? import Answer

class AnswerForm(ModelForm):
    class Meta:
        model = Answer
        fields = ('answer')

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/17 21: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
    等を参考にしたものです。

    キャンセル

0

if f.is_valid():
    rec_answer = f['answer'].value()
    rec = Answer(answer=rec_answer)
    rec.save()
でもいけるとは思いますが、is_validでバリデーションをチェックしてるなら
if f.is_valid():
    rec_answer = f.cleaned_data['answer']
    rec = Answer(answer=rec_answer)
    rec.save()
とするのが一般的かと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/22 21:39 編集

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

    キャンセル

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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