こう書くと、HTML上ではvalueUpdate: 'afterkeydown'
がエスケープされてvalueUpdate: 'afterkeydown'
となり、afterkeydownが効かない。
form_exapmle1.py
from django import forms
class ExampleForm(forms.Form):
address = forms.CharField(
widget=forms.TextInput(
attrs={
'data-bind': 'value: address, valueUpdate: \'afterkeydown\''
}
)
)
エスケープされないようにするには、mark_safeを使う。
form_exapmle2.py
from django import forms
from django.utils.safestring import mark_safe
class ExampleForm(forms.Form):
address = forms.CharField(
widget=forms.TextInput(
attrs={
'data-bind': mark_safe('value: address, valueUpdate: \'afterkeydown\'')
}
)
)
data-bind属性の中にユーザーが入力した値を埋め込む仕様であればXSS脆弱性になるので、ユーザーの入力値は手動でエスケープする必要がある。(そもそも、そういう設計は避けた方がいいとは思うけど…)
参考
http://stackoverflow.com/questions/777458/django-form-values-without-html-escape