2010-11-26 9 views
2

max_lengthとsizeが動的(つまり、これらの属性はモデル作成後に変更可能)である文字カウントを数えたり制限したりするためのJavaScriptコードがあるtextareaフォームエントリを使用しようとしています。Django:javascript文字カウンタ/リミッタ付きのテキストエリアウィジェットを使用していますか?

この機能をdjangoフォームのtextareaウィジェットに含めるには、カスタムウィジェットを作成する必要があると思いますが、実際にはテンプレートのJavaScriptコードをどのように結びつけるべきかわかりません。テキストエリアのサイズを変更するために、私は、テキストエリアウィジェットのインスタンスを生成するビューからフォーム作成に変数を渡すと仮定します。

これ以外の場合は、テンプレートの入力をhtml/jsで作成し、POSTデータをdjangoビューに送信し、getitemを使用して取得し、そのデータをモデルに直接保存します。もちろん、django'yではありませんが、組み込みのdjangoバリデーションとクリーンなデータ関数がなければ、おそらく何らかの形で脆弱です。

私が推測するように、2つの質問:私は、テンプレート内のテキストエリアのフィールドに私のjavascript関数を適用しない方法(a)の私はカスタムDjangoのフォームウィジェットを作成する場合は、(「onkeypressでは= jstextcounter ...」を含む)と、 (b) django形式のないビュー内のポストデータを取得し続けるだけの場合、脆弱性が存在し、データの妥当性を確認するためにはどうすればよいですか? (パブリックコメントボックスではなく、既にユーザーのログインが必要です)

誰かがこのようなカスタムフォームウィジェットを作成していて、どこかで良いスニペットを知っていますか?

乾杯...

EDIT のでMovieYodaの助けのおかげで、私はこの作業とDjangoでdynamic forms比べていくつかの読書を得ました。そして、%dの代用では、私のjs関数のmaxChars属性を動的に変更することができます。 forms.pyで

は私が持っている:テンプレート内のjs関数「textCounter」はmaxCharsの変数を使用して、文字の数を制限している

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' 

<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) 
+0

いくつかのコードしてください? –

答えて

6

(a)のIは、カスタムDjangoのフォームウィジェットを作成した場合、どのように私はに私のjavascriptの 関数を適用します テンプレートでテキストエリアのフィールドはと

( "onkeypressでは= jstextcounter ..." を含んでいます)

私はあなたのフォーム要素にJavaScriptハンドラを定義したいと思っていましたか?ここでは1本に近づくことができる方法です - forms.py

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

今、いつものようにフォームをレンダリングします。あなたのjsファイルに、このハンドラ関数jscode()&を書いて、あなたが望むようにします。

私はちょうど Djangoのフォームなしビューでポストデータを取得し続けると(b)は、脆弱性 があると私は データを確実にするために何をすべきは、よく検証されますか?

2番目の部分も簡単に処理できます。 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.') 

清潔なfn。この形式(clean_<field_to_be_cleaned>)である必要があります。ここはseです。そう...

別に@login_requiredを確認してから - (ユーザーがフォームを使用していくつかのデータを提出する場合)あなたのビューがログインしているユーザーによってアクセスされていることを確認せたが、あなたはあなたのフォームテンプレートで& urlencodeあなたのデータをcsrf_tokenを使用する必要があります。今あなたは行こうとしています...

1

このjQuery libraryは、あなたが何をしているのですか?入力を制限するだけでなく、残りの文字数をユーザーに表示します。

ダウンロードおよびライブラリhereを参照し、それを呼び出すために、次のコードを使用します。

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#textarea1").CharacterCount({ 
      charactersRemainingControlId: "remainingCount1" 
     }); 
    }); 
</script>  

<textarea id="textarea1" name="textarea1" cols="20" rows="3" maxlength="10"></textarea> 

The number of characters left is: <span id="remainingCount1">0</span> 
関連する問題