Django:使用带有javascript字符计数器/限制器的textarea小部件?

HdN*_*dN8 2 javascript forms django textarea widget

我正在尝试使用textarea表单条目,我有一些javascript代码来计算和限制字符数,其max_length和size是动态的(即这些属性在模型创建后可以改变).

为了在django form textarea小部件中包含此功能,我想我必须创建一个自定义小部件,虽然我不确定如何真正地绑定模板中的javascript代码.为了更改textarea大小,我想我会从视图中将变量传递给表单创建,以生成textarea小部件实例.

否则,现在我只是在html/js中创建模板中的输入,然后将POST数据提交到django视图,并使用getitem检索它,然后将数据直接保存到我的模型中.当然哪个工作,但不是非常django'y,如果没有内置的django验证和干净的数据功能,也许在某种程度上是脆弱的.

所以我猜两个问题: (a) 如果我创建一个自定义django表单小部件,如何将我的javascript函数应用于模板中的textarea字段(包括"onkeypress = jstextcounter ...")和(b)如果我继续只是在没有django表单的情况下检索视图中的帖子数据,是否存在漏洞,我该怎么做才能确保数据得到充分验证?(页面已经要求用户登录,而不是公共评论框)

或者也许某人之前已经创建了这样一个自定义表单窗口小部件并知道某个好的代码片段?

干杯...

编辑 所以感谢MovieYoda的帮助,我得到了这个工作,并阅读了django中的动态表格.使用%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'
Run Code Online (Sandbox Code Playgroud)

其中模板中的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>
Run Code Online (Sandbox Code Playgroud)

在视图中创建带有kwargs输入的表单:

FormInstance = MyForm(size=1, maxChars=5)
Run Code Online (Sandbox Code Playgroud)

Sri*_*aju 6

(a)如果我创建自定义django表单小部件,如何将我的javascript函数应用于模板中的textarea字段(包括"onkeypress = jstextcounter ...")和

从我能够理解你想要在表单元素上定义javascript处理程序?以下是人们如何处理这个问题 -

在forms.py中

class Search(forms.Form):
 se=forms.CharField(widget=forms.TextInput(attrs={'onClick':'return jscode();'}))
Run Code Online (Sandbox Code Playgroud)

现在像往常一样渲染表单.在你的js文件中,编写这个处理函数jscode()并使它做你想要的.

(b)如果我继续只是在没有django表单的情况下检索视图中的帖子数据,是否存在漏洞,我该怎么做才能确保数据得到充分验证?

第二部分也可以轻松处理.在forms.py文件中,定义要为其执行某些数据验证的这些成员函数.你可以这样做 -

class Search(forms.Form):
 se=forms.CharField(widget=forms.TextInput(attrs={'onClick':'return jscode();'}))
 def clean_se(self):
    #do your validaton here. In case of error raise ValidationError.
    raise forms.ValidationError('Passwords do not match.')
Run Code Online (Sandbox Code Playgroud)

注意干净的fn.应采用这种格式 - clean_<field_to_be_cleaned>.在这里se.所以...

除了确保@login_required- 这确保您的视图由登录用户访问,您需要csrf_token在表单模板和urlencode数据中使用(如果用户通过表单提交一些数据).现在你很高兴去...