Django ';字段文件';对象没有属性';完全清洁';
我一直在尝试在django中的一个文件字段上实现一个文件大小验证器,但我不能真正让它工作 在我添加这个验证器之前,一切正常。在我添加它之后,我再也不能上传文件了。错误显示“文件字段没有完整的\u clean属性” views.pyDjango ';字段文件';对象没有属性';完全清洁';,django,Django,我一直在尝试在django中的一个文件字段上实现一个文件大小验证器,但我不能真正让它工作 在我添加这个验证器之前,一切正常。在我添加它之后,我再也不能上传文件了。错误显示“文件字段没有完整的\u clean属性” views.py from django.shortcuts import render, get_object_or_404 from .models import Oferta, CV from django.contrib import messages from django.
from django.shortcuts import render, get_object_or_404
from .models import Oferta, CV
from django.contrib import messages
from django.core.paginator import Paginator
def incarcarecv(req):
context = {
'title': "Incarcare CV | Best DAVNIC73"
}
if req.method == 'POST':
nume = req.POST['nume']
prenume = req.POST['prenume']
telefon = req.POST['telefon']
email = req.POST['email']
cv = req.FILES['CV']
if(req.user.is_authenticated):
cv_upload = CV(
solicitant=req.user,
nume=nume,
prenume=prenume,
telefon=telefon,
emailContact=email
)
cv_upload.CVFile.full_clean()
cv_upload.CVFile.save(cv.name, cv)
cv_upload.save()
req.user.profile.cvuri.append(cv_upload.id)
req.user.profile.save()
messages.success(req, 'CV depus cu succes!')
else:
messages.error(req, 'Trebuie sa fii logat pentru a depune CV-ul!')
return render(req, "../templates/pagini/incarcare-cv.html", context)
models.py
from django.db import models
from django.contrib.auth.models import User
from .validators import validate_file_size
# Create your models here.
class Oferta(models.Model):
solicitant = models.ForeignKey(User, on_delete=models.CASCADE)
dataSolicitare = models.DateField(auto_now_add=True)
cor = models.CharField(max_length=25)
denumireMeserie = models.CharField(max_length=12)
locuri = models.IntegerField()
agentEconomic = models.CharField(max_length=50)
adresa = models.CharField(max_length=150)
dataExpirare = models.DateField()
experientaSolicitata = models.CharField(max_length=200)
studiiSolicitate = models.CharField(max_length=200)
judet = models.CharField(max_length=20)
localitate = models.CharField(max_length=25)
telefon = models.CharField(max_length=12)
emailContact = models.EmailField(max_length=40)
rezolvata = models.BooleanField(default=False)
def __str__(self):
return self.cor
class CV(models.Model):
solicitant = models.ForeignKey(User, on_delete=models.CASCADE)
dataUploadCV = models.DateField(auto_now_add=True)
nume = models.CharField(max_length=12)
prenume = models.CharField(max_length=12)
telefon = models.CharField(max_length=12)
emailContact = models.EmailField(max_length=40)
CVFile = models.FileField(upload_to='documents/%d/%m/%Y', validators=[validate_file_size])
rezolvata = models.BooleanField(default=False)
def __str__(self):
return self.nume + " " + self.prenume + ": " + str(self.CVFile)
验证器.py
from django.core.exceptions import ValidationError
def validate_file_size(value):
filesize=value.size
if filesize > 5000000:
raise ValidationError("Maximum 5MB!")
我就是不明白为什么。你能帮我修改代码吗?
据我所知,.full_clean()运行一些默认的django验证器+模型中设置的验证器
但实际上它不起作用
Exception Value:
'FieldFile' object has no attribute 'full_clean'
你能给我解释一下为什么会发生这种情况,以及我如何让我的验证器运行吗
谢谢
//顺便说一下,有人建议像这样改变行的顺序-
cv_upload.CVFile.save(cv.name, cv)
cv_upload.CVFile.full_clean()
但是它无论如何都不起作用。正如错误所说,
full\u clean()
不是模型字段的方法。这是模型本身的一种方法
cv\u upload.full\u clean()
有效
但是你应该直接用文件初始化你的cv\u上传
:
cv_upload = CV(
solicitant=...,
...,
CVFile=cv)
然后您不必单独保存文件,请参阅
此外,您正在运行full\u clean()
,但未捕获任何异常。如果验证失败怎么办?将抛出一个ValidationError
。如果您没有捕获它,您的视图将返回一个HTTP500错误(它将崩溃)
因此,请将其包装在中,然后尝试。。。除
条款外:
try:
cv_upload.full_clean()
except ValidationError as e:
messages.error(request, e)
else:
cv_upload.save()
messages.success(request, "yeah!")
它起作用了。请解释一下跑步后保存的区别。完全清洁和你怎么说?我认为,如果我按自己的方式进行验证,那么根本不会运行验证程序,因为.save是在验证之后运行的。验证允许您在将提供的数据保存到数据库之前检查数据是否有效(因此,在保存数据库中的坏数据时不会出现异常)。因此,先储蓄是没有意义的。