2011-02-10 4 views
2

カスタムウィジェットとそれを使用するフォームを作成しました。 以前、私はちょうど私がそれをデバッグして、フォームを表示する単純なテンプレートを持っていた:djangoはフォームのレンダリング時にウィジェットをエスケープします

<form> 
    {{ run_form.as_p }} 
</form> 

は今、私はdivの中で、各フォームフィールドを囲みたいので、私は

{% for field in form %} 
     <div class="fieldWrapper"> 
      {{ field.errors }} 
      {{ field.label_tag }}: {{ field }} 
     </div> 
{% endfor %} 
にテンプレートを変更しました

しかし、フィールドがレンダリングされると、その文字はすべてHTMLでエスケープされているように見えるので、ソースコードを見ると、&lt;input type=&quot;text&quot; id=&quot;id_scriptscrap&quot;/&gtのようになります。 <input type="text" id="id_scriptscrap"/>のようになります。

紛失しているものがありますか?最初のテンプレートはエスケープしないで出力し、2番目のテンプレートはエスケープするのはなぜですか?おそらく私はカスタムウィジェットクラスを作成するときに何か間違っていましたか?

答えて

5

カスタムウィジェットクラスを作成するときに間違ったことがありましたか?

おそらく、あなたがコードを投稿していないので、それを伝えることは不可能です。

form.as_p作品はform._html_output()方法ということである理由 - 様々なas_foo方法が使用するものである - その出力にmark_safeを呼び出します。ただし、組み込みのウ​​ィジェットクラスもそれぞれと呼びます。mark_safeは独自の出力で呼び出すため、個々に動作します。おそらく、カスタムウィジェットで同じことをするだけです。 。

+1

感謝の一例password = forms.PasswordInputのために、それはただ、将来の読者:)のために明確にすることだった - ウィジェットのは、(レンダリング)メソッドは、mark_safe()でマークされていない文字列を返し、テンプレートがそれをエスケープしました。 – olamundo

0

代替原因は:あなたが誤ってウィジェットの代わりにフィールドを持つフォームを定義した場合、これはまた起こる(代わりにpassword = forms.CharField(widget=forms.PasswordInput)

関連する問題