【发布时间】:2011-05-16 04:17:43
【问题描述】:
我正在尝试使用一个 textarea 表单条目,我有一些 javascript 代码来计算和限制字符数,其 max_length 和 size 是动态的(即这些属性在模型创建后是可更改的)。
为了在 django 表单 textarea 小部件中包含此功能,我想我必须创建一个自定义小部件,尽管我不确定如何在模板中绑定 javascript 代码。为了更改 textarea 大小,我想我会将一个变量从视图传递到表单创建中以生成 textarea 小部件实例。
否则,现在我只是在 html/js 中的模板中创建输入,然后将 POST 数据提交到 django 视图,并使用 getitem 检索它,然后将数据直接保存到我的楷模。这当然可行,但不是很 django'y,并且如果没有内置的 django 验证和清理数据功能,可能会在某种程度上易受攻击。
我猜有两个问题:(a) 如果我创建一个自定义 django 表单小部件,我如何将我的 javascript 函数应用于模板中的 textarea 字段(包括“onkeypress=jstextcounter.. .") 和 (b) 如果我继续仅在没有 django 表单的情况下检索视图中的帖子数据,是否存在漏洞,我应该怎么做才能确保数据得到充分验证? (页面已经需要用户登录,而不是公共评论框)
或者也许有人以前创建过这样的自定义表单小部件并且知道某个地方的好 sn-p?
干杯...
编辑 所以感谢 MovieYoda 的帮助,我得到了这个工作,并在 django 中阅读了dynamic forms。使用 %d 替代品,我可以动态更改我的 js 函数的 maxChars 属性。
在 forms.py 我有:
text=forms.CharField(max_length = 1000, widget=forms.widgets.Textarea())
def __init__(self, *args, **kwargs):
size = kwargs.pop('size')
maxChars = kwargs.pop('maxChars')
super(MyForm, self).__init__(*args, **kwargs)
self.fields['text'].widget.attrs['onkeypress'] = 'return textCounter(this, this.form.counter, %d);' % maxChars
self.fields['text'].widget.attrs['rows'] = size
self.fields['text'].widget.attrs['cols'] = '40'
模板中的js函数'textCounter'是限制字符数的地方,使用maxChars变量。
<script type="text/javascript">
function textCounter( field, countfield, maxLimit) {
if ( field.value.length > maxLimit )
{
field.value = field.value.substring( 0, maxLimit );
return false;
}
else
{
countfield.value = maxLimit - field.value.length;
}
}
</script>
并在视图中使用 kwargs 输入创建表单:
FormInstance = MyForm(size=1, maxChars=5)
【问题讨论】:
标签: javascript django forms textarea widget