3

データを使用するアプリケーションが非 ASCII 文字を処理できないため、アップロードされたファイルの名前に非 ASCII 文字を含めないようにする必要があります。簡単な検証エラーを表示したい。

通常clean_<filefieldname>、ModelForm のメソッドでこれを行います。動作しますが、問題は、ファイルがアップロードされた後に呼び出されることです (ファイル データなどを確認したい場合があるため、これは理にかなっています)。

ただし、この場合、実際のファイル データは必要なく、名前だけが必要であり、何かをアップロードする前に検証したいと考えています。どこでこれを行うことができますか (クライアント側の JS チェックを行うためにすべての管理テンプレートを変更する以外に)?

編集:

Ghopper21 の回答に続いて、このアップロード ハンドラーを作成しました (そして、settings.py のリストの先頭に追加しました)。

class CheckFilenameUploadHandler(FileUploadHandler):

   def receive_data_chunk(self, raw_data, start):
      return raw_data, start

   def file_complete(self, file_size):
      return None

   def new_file(self, field_name, file_name, content_type, content_length, charset):
      try:
         validate_string(file_name)
      except ValidationError:
         raise StopFutureHandlers

名前が適切でない場合、validation_string は ValidationError を発生させます。ただし、これにより、ファイル名が有効かどうかに関係なく、POST 要求でタイムアウトが発生します。django ページの UploadHandler doc 以外の詳細な例は見つかりませんでした。

StopFutureHandlers の代わりに StopUpload を発生させると、正しいファイルに対して同じ動作が得られますが、無効なファイルは実際にはアップロードされません。ただし、clean メソッドが実装されていても、検証エラーが表示されるのではなく、モデルのリスト ビューにリダイレクトされます。 「保存して編集を続ける」と言います。

4

1 に答える 1

1

ファイル名が無効な場合、ファイル データの実際のアップロードをスキップするカスタム アップロード ハンドラを使用するのが最善の方法です。その後も、clean_<filefieldname>メソッドを使用して検証エラーを発生させます。

ファイル名を 2 か所で確認しなければならないのは少し面倒です。ただし、バインドされたフォームを作成するときに渡すHttpRequestオブジェクトPOSTまたはプロパティにアクセスするとすぐに、Django がファイル データをアップロードするため、フォーム内ですべてを実行することはできません。FILE

于 2012-08-24T11:00:57.983 に答える