Django ';字段文件';对象没有属性';完全清洁';

Django ';字段文件';对象没有属性';完全清洁';,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.

我一直在尝试在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.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是在验证之后运行的。验证允许您在将提供的数据保存到数据库之前检查数据是否有效(因此,在保存数据库中的坏数据时不会出现异常)。因此,先储蓄是没有意义的。