模型形式的Django csv文件验证clean方法

模型形式的Django csv文件验证clean方法,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,以下是在my Django应用程序中上载csv文件的文件模型: class File(models.Model): uploaded_by = models.ForeignKey( User, on_delete=models.CASCADE, ) csv_file = models.FileField( upload_to='csvfiles/', ) 调用/upload_fileurl模式时,upload_csv_file视图执行如下操作: def

以下是在my Django应用程序中上载csv文件的文件模型:

class File(models.Model):
  uploaded_by = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
  )
  csv_file = models.FileField(
    upload_to='csvfiles/',
  )
调用
/upload_file
url模式时,
upload_csv_file
视图执行如下操作:

 def upload_csv_file(request):
   if request.method == 'POST':
      csv_form = CSVForm(request.POST, request.FILES)
      if csv_form.is_valid():
        file_uploaded = csv_form.save(commit=False)
        file_uploaded.uploaded_by = request.user
        csv_form.save()
        return HttpResponse("<h1>Your csv file was uploaded</h1>")

   elif request.method == 'GET':
      csv_form = CSVForm()
      return render(request, './mysite/upload_file.html', {'csv_form': csv_form})
我不确定是否正在调用
def clean\u csv\u文件(self)

有很多方法可以在基于函数的视图中验证文件扩展名和大小,但是我想验证模型表单的
clean()
方法本身中的文件属性

更新:找到解决方案

def clean_csv_文件(self)必须返回上载的_csv_文件变量的实例,而不是True


另外,如果ModelForm类中存在clean_field(),则不需要clean()方法。

您应该已经显示了完整的错误和回溯

但是,您从
clean\u csv\u文件返回的内容会导致错误。clean函数的返回值必须始终是已清理的数据本身;对于clean_field方法,它必须是该字段的已清理数据,对于general clean方法,它必须是完全已清理的_data dict。因此:

def clean_csv_file(self):
   uploaded_csv_file = self.cleaned_data['csv_file']

   if uploaded_csv_file:
     filename = uploaded_csv_file.name
     if filename.endswith(settings.FILE_UPLOAD_TYPE):
        if uploaded_csv_file.size < int(settings.MAX_UPLOAD_SIZE):
            return uploaded_csv_file   # Here
        else:
            raise forms.ValidationError(
                "File size must not exceed 5 MB")
    else:
        raise forms.ValidationError("Please upload .csv extension files only")

  return uploaded_csv_file
def clean_csv_文件(self):
上传的\u csv\u文件=自清理的\u数据['csv\u文件']
如果上载了\u csv\u文件:
filename=上传的\u csv\u file.name
如果filename.endswith(settings.FILE\u UPLOAD\u TYPE):
如果上载了\u csv\u file.size

请注意,您的
clean
方法也是错误的,但是更正的版本(将返回
cleaned\u data
)根本没有任何作用,因此您应该删除整个内容。

是的,谢谢!它起作用了。尽管我想知道仅定义clean()是否足够?
  Attribute error: 'bool' object has no attribute 'get'
def clean_csv_file(self):
   uploaded_csv_file = self.cleaned_data['csv_file']

   if uploaded_csv_file:
     filename = uploaded_csv_file.name
     if filename.endswith(settings.FILE_UPLOAD_TYPE):
        if uploaded_csv_file.size < int(settings.MAX_UPLOAD_SIZE):
            return uploaded_csv_file   # Here
        else:
            raise forms.ValidationError(
                "File size must not exceed 5 MB")
    else:
        raise forms.ValidationError("Please upload .csv extension files only")

  return uploaded_csv_file