旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Django] FileFieldのカスタムバリデーションで微ハマり

2008年12月15日

Fieldに対してカスタムバリデーションを設定する際に、
それがFileField(とそのサブクラス)である場合にやや設定方法に違いがあってハマった。
Django は 1.0.2-final です。

結論から申しますと、こんな風にcleanを書く必要がある。

def clean(self, value, initial):
# ...エラー処理とか...
return value

何が違うかというと、第3引数のinitial(変数名はなんでもいいけど)が必要だってことです。

ここで、ググっても話題に出てこないので、
本当にこれでいいのかとソース確認
何はともあれ、夢と希望と自分ほど信じられないものはない

…/django/forms/form.py の full_cleanメソッド内

try:
if isinstance(field, FileField):
initial = self.initial.get(name, field.initial)
value = field.clean(value, initial) # 引数の数が
else:
value = field.clean(value) # 違います
self.cleaned_data[name] = value

・・・うん、なんか処理分けてるね!

何で分けてるのかはわからんけど、対処は間違ってないっぽい。