【发布时间】:2019-06-21 13:16:02
【问题描述】:
以下是在我的 Django 应用程序中上传 csv 文件的 FileModel:
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})
在 forms.py 中,我正在验证以下内容:
- 文件扩展名 (.csv)
-
文件大小(5 mb)
class CSVForm(forms.ModelForm): class Meta: model = File fields = ('csv_file',) 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 True return uploaded_csv_file else: raise forms.ValidationError( "Error") else: raise forms.ValidationError("Error") return uploaded_csv_file # no need for a separate def clean() # def clean(self): # cleaned_data = super(CSVForm, self).clean() # uploaded_csv_file = cleaned_data.get('csv_file') # return uploaded_csv_file
但是我在提交文件上传按钮时遇到以下错误:
Attribute error: 'bool' object has no attribute 'get'
我不确定def clean_csv_file(self) 是否被调用。
有一些方法可以在基于函数的视图中验证文件扩展名和大小,但我想在 ModelForm 的 clean() 方法本身中验证文件属性。
更新:找到解决方案
def clean_csv_file(self) 必须返回一个 upload_csv_file 变量的实例来代替 True。
另外,如果 ModelForm 类中存在 clean_field(),则不需要 clean() 方法。
【问题讨论】:
标签: django django-models django-forms django-views