2011-02-06 5 views
1

Windowsの行末は実際には2文字(\r\n)なので、max_lengthはそれらを2文字として扱います。私はそれらを1人のキャラクターとして扱うことを望みます。django - max_lengthフォームの検証時にWindowsの行末を処理する

これに対処するにはどうすればよいでしょうか?私は行末を変換するのが最善であると仮定しますが、プロセスのどこでこれを行うのですか?

答えて

4

フォームのclean_<fieldname>()メソッドをオーバーライドするか、より一般的なclean()メソッドをオーバーライドして、改行を変換します。データを消去する前に、DjangoはそれをPythonに変換して検証するので、max_length検証をオーバーライドされたcleanメソッドに移す必要もあります。また、「このメソッドは、何かを変更したかどうかにかかわらず、クリーンなデータを返す必要があります。あなたのケースでは

http://docs.djangoproject.com/en/dev/ref/forms/validation/

、コードは次のようになります。

from django import forms 
from string import replace 

class YourForm(forms.Form): 
    some_field = forms.CharField() 
    # Your fields here 

    def clean_some_field(self): 
     max_length = 50 
     data = self.cleaned_data["some_field"] 
     data = replace(data, "\r", "") 
     if len(data) > max_length: 
      raise forms.ValidationError("some_field is too long!") 
     return data 
+0

これは素晴らしいです、ありがとうございました!私は少しでも苦労しています。フィールドは消去されますが、生データに対して検証が行われています。 'form.is_valid()'を実行すると、フォームのすべてのフィールドが消去された後で検証が実行されますか?あるいは、何かの上で 'is_valid()'を実行する必要がありますか? – Acorn

+0

問題は 'clean_ ()'が 'max_length'のようなものの検証後に実行されることです。つまり、 'clean_ ()'の長さのバリデーションを行い、フィールドから 'max_length'を取り除かなければなりません。たぶんあなたはあなたの答えを更新することができますか? http://stackoverflow.com/questions/4914123/django-how-to-process-clean-a-field-before-validation – Acorn

+0

ああ、そうです。私は答えを更新します、それを指摘してくれてありがとう。 –

関連する問題