1
Windowsの行末は実際には2文字(\r\n
)なので、max_lengthはそれらを2文字として扱います。私はそれらを1人のキャラクターとして扱うことを望みます。django - max_lengthフォームの検証時にWindowsの行末を処理する
これに対処するにはどうすればよいでしょうか?私は行末を変換するのが最善であると仮定しますが、プロセスのどこでこれを行うのですか?
Windowsの行末は実際には2文字(\r\n
)なので、max_lengthはそれらを2文字として扱います。私はそれらを1人のキャラクターとして扱うことを望みます。django - max_lengthフォームの検証時にWindowsの行末を処理する
これに対処するにはどうすればよいでしょうか?私は行末を変換するのが最善であると仮定しますが、プロセスのどこでこれを行うのですか?
フォームの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
これは素晴らしいです、ありがとうございました!私は少しでも苦労しています。フィールドは消去されますが、生データに対して検証が行われています。 'form.is_valid()'を実行すると、フォームのすべてのフィールドが消去された後で検証が実行されますか?あるいは、何かの上で 'is_valid()'を実行する必要がありますか? – Acorn
問題は 'clean_()'が 'max_length'のようなものの検証後に実行されることです。つまり、 'clean_ ()'の長さのバリデーションを行い、フィールドから 'max_length'を取り除かなければなりません。たぶんあなたはあなたの答えを更新することができますか? http://stackoverflow.com/questions/4914123/django-how-to-process-clean-a-field-before-validation –
Acorn
ああ、そうです。私は答えを更新します、それを指摘してくれてありがとう。 –