模型形式的Django csv文件验证clean方法
以下是在my Django应用程序中上载csv文件的文件模型:模型形式的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
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