3

ファイルフィールドを含むモデルがあります。PDFファイルに制限したい。管理者レベルとシェルレベルのモデル作成もチェックしたいので、モデルに clean メソッドを書きました。しかし、モデルクリーンメソッドでは機能しません。ただし、フォームクリーンメソッドは機能しています。

class mymodel(models.Model):
    myfile = models.FileField()

    def clean():
        mime = magic.from_buffer(self.myfile.read(), mime=True)
        print mime
        if not mime == 'application/pdf':
            raise ValidationError('File must be a PDF document')

class myform(forms.ModelForm):
    class Meta:
        model = mymodel
        fields = '__all__'

    def clean_myfile(self):
        file = self.cleaned_data.get('myfile')
        mime = magic.from_buffer(file.read(), mime=True)
        print mime
        if not mime == 'application/pdf':
            raise forms.ValidationError('File must be a PDF document')
        else:
            return file

PDF をアップロードすると、MIME in form clean メソッドが正しく検証されます (printing 'application/pdf')。しかし、モデルのクリーンメソッドは検証されていません。「application/x-empty」として MIME を出力しています。私はどこで間違っていますか?

また、もう 1 つの問題は、モデルの clean メソッドが検証エラーを発生させた場合、フォームではフィールド エラーとして表示されず、フィールド以外のエラーとして表示されることです。なんでそうなの ?

4

2 に答える 2

3

フォーム検証を使用しているため、モデルのクリーンメソッドについて心配する必要はありません

あなたはすでにフォームで正しいことをしています

def clean_file(self):
        yourfile = self.cleaned_data.get("your_filename_on_template", False)
        filetype = magic.from_buffer(yourfile.read())
        if not "application/pdf" in filetype:
            raise ValidationError("File is not PDF.")
        return yourfile

モデルをきれいに使いたい場合は、独自のバリデーターを作成できます

https://stackoverflow.com/a/27916582/5518973

サーバー側のpython-django検証を使用していますが、javascriptはファイルクライアント側を検証するための優れた方法でもあります.javascript正規表現検証については、この回答を探すことができます

https://stackoverflow.com/a/17067242/5518973

または、プラグインを使用できる場合は、jquery 検証プラグインを使用できます

https://jqueryvalidation.org/

于 2016-10-01T18:30:18.317 に答える