5

私は最終的に、拡張子の種類ごとにFileFieldを検証しようとしています。しかし、このフィールドのクリーンなメソッドでPOST値を取得することさえできません。

from django.forms.forms import Form
from django.forms.fields import FileField
from django.forms.util import ValidationError

class TestForm(Form):        
    file = FileField(required=False)

    def clean_file(self):
        value = self.cleaned_data["file"]
        print "clean_file value: %s" % value
        return None     

@localhost
def test_forms(request):
    form = TestForm()    
    if request.method == "POST":
        form = TestForm(request.POST)        
        if form.is_valid():
            print "form is valid"
    return render_to_response("test/form.html", RequestContext(request, locals()))

コードを実行すると、次の出力が表示されます。

clean_file value: None
form is valid

つまり、clean_fileメソッドはファイルデータを取得できません。同様に、Noneを返した場合でも、フォームは有効です。

これが私のフォームhtmlです:

<form enctype="multipart/form-data" method="post" action="#">
   <input type="file" id="id_file" name="file">
   <input type="submit" value="Save">
</form>

この問題の解決策が記載されたスニペットをいくつか見ましたが、モデル以外のフォームで機能させることはできません。どちらもカス​​タムフィールドタイプを宣言します。そうすると、同じ問題が発生します。super()を呼び出すと、Noneオブジェクトが返されます。

4

1 に答える 1

7

request.FILES投稿でフォームをインスタンス化するときに、フォームに渡されていません。

 form = TestForm(request.POST, request.FILES)

ドキュメントを参照してください。

また、POSTでフォームを2回インスタンス化していることに注意してください。これは、不要です。関数の最後(と同じレベルif request.method == 'POST')にあるelse句に最初の句を移動します。

于 2010-10-07T17:56:31.197 に答える