我需要阻止上传文件名称中的任何非ASCII字符,因为使用数据的应用程序无法处理它们。我想显示一个简单的验证错误。
通常我在ModelForm上的clean_<filefieldname>
方法中执行此操作。它可以工作,但问题是在文件上传后调用它(这是有意义的,因为我可能想检查文件数据等)。
但是,在这种情况下,我不需要实际的文件数据,只需要名称,并且希望在上传任何内容之前对其进行验证。我在哪里可以做到这一点(除了修改我的所有管理模板以进行客户端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
如果名称不正确,validate_string会引发ValidationError。但是,无论文件名是否有效,这都会使POST请求超时。除了django页面上的UploadHandler文档之外,我找不到更详细的示例。
如果我提出StopUpload而不是StopFutureHandlers,我得到了正确文件的相同行为,但实际上没有上传无效文件 - 但是我被重定向到模型的列表视图而不是看到验证错误,即使是干净的方法已实现,我说“保存并继续编辑”。
答案 0 :(得分:1)
从我所看到的最好的方法是使用custom upload handler,如果文件名无效,则会跳过文件数据的实际上传。然后,您仍然使用clean_<filefieldname>
方法来引发验证错误。
必须在两个地方检查文件名,这有点烦人。但是,无论如何,您无法在表单中完成所有操作,因为Django会在您访问HttpRequest
对象的POST
或FILE
属性时立即上传文件数据,是你在创建绑定表单时传入的内容。