Python 即使抛出异常,条目也会进入数据库

Python 即使抛出异常,条目也会进入数据库,python,django,Python,Django,所以我有一个表单,它接受一些输入和一个文件字段。我正在对文件文件使用验证器来检查文件的大小。它工作得很好,因为我在页面上看到一个错误,说文件太大,但是条目仍然进入数据库 我不知道为什么会这样。在我的案例中,我认为提出一个例外会起作用,但事实并非如此。 models.py from django.db import models from django.contrib.auth.models import User from .validators import validate_file_siz

所以我有一个表单,它接受一些输入和一个文件字段。我正在对文件文件使用验证器来检查文件的大小。它工作得很好,因为我在页面上看到一个错误,说文件太大,但是条目仍然进入数据库

我不知道为什么会这样。在我的案例中,我认为提出一个例外会起作用,但事实并非如此。 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 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)
    CV = 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.CV)
验证器.py

from django.core.exceptions import ValidationError


def validate_file_size(value):
    filesize=value.size

    if filesize > 1:
         raise ValidationError("Fisierul poate avea maxim 5MB.")
    else:
        return value
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

# Create your views here

def incarcarecv(req):
    context = {
        'title': "Incarcare CV | Best DAVNIC73"
    }
    if req.method == 'POST':
        try:
            nume = req.POST['nume']
            prenume = req.POST['prenume']
            telefon = req.POST['telefon']
            email = req.POST['email']
            cv = req.FILES['CV']
            try:
                if(req.user.is_authenticated):
                    cv_upload = CV(
                    solicitant=req.user,
                    nume=nume,
                    prenume=prenume,
                    telefon=telefon,
                    emailContact=email
                    )
                    cv_upload.CV.save(cv.name, cv)
                    cv_upload.full_clean()
                    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!')
            except (ValueError):
                messages.error(req, 'Formularul nu a fost incarcat!')
                messages.info(req, 'Verifica daca esti logat!')
        except:
            messages.error(req, 'Nu ai completat corect campurile sau unul din ele este liber!')
            messages.info(req, 'Ai grija ca toate campurile sa fie completate si ca fisierul sa nu depaseasca 5MB!')
    return render(req, "../templates/pagini/incarcare-cv.html", context)

html文件

{% extends 'base.html' %}
{% load static %}
{% block content %}
            <div class="container container-centru">
                <h1 class="heading-contact">Incarca CV</h1>
                {% include 'partials/_alerts.html' %}
                <form action="{% url 'incarcarecv' %}" method="POST" class="form-contact"  enctype="multipart/form-data">
                    {% csrf_token %}
                        <div class="form-group">
                            <label for="inputnume" class="email-contact">Nume</label>
                            <input type="text" name="nume" class="form-control" id="inputnume" aria-describedby="numeHelp" placeholder="Introdu nume">
                        </div>
                        <div class="form-group">
                                <label for="inputprenume" class="email-contact">Prenume</label>
                                <input type="text" name="prenume" class="form-control" id="inputprenume" aria-describedby="prenumeHelp" placeholder="Introdu prenume">
                        </div>
                        <div class="form-group">
                            <label for="inputtelefon" class="email-contact">Telefon</label>
                            <input type="text" name="telefon" class="form-control" id="inputtelefon" aria-describedby="telefonHelp" placeholder="Introdu telefon">
                        </div>
                        <div class="form-group">
                            <label for="inputemail" class="email-contact">Email</label>
                            <input type="email" name="email" class="form-control" id="inputemail" aria-describedby="emailHelp" placeholder="Introdu email">
                        </div>
                        <div class="form-group">
                                <label for="inputcv" class="email-contact">CV</label>
                                <input type="file" name="CV" accept=".docx,.doc,.pdf,application/msword" class="form-control" id="inputemail" aria-describedby="CVHelp">
                            </div>
                        <div class="form-group form-group-custom">
                                <input type="submit" value="Trimite" class="btn btn-secondary btn-block btn-login-custom">
                                <input type="submit" value="Resetează câmpurile" class="btn btn-secondary btn-block btn-reset-custom">
                        </div>                   
                </form>
            </div>
            <script src="{% static 'javascript/clearMessage.js' %}"></script>                  
{% endblock %}
{%extends'base.html%}
{%load static%}
{%block content%}
肉豆蔻
{%include'partials/_alerts.html%}
{%csrf_令牌%}
努姆
Prenume
电传
电子邮件
个人简历
{%endblock%}
因此,如果抛出异常,如何使post不进入DB?现在我得到了错误,但它仍在进入数据库。(我可以在django的行政区看到)

////编辑:我从代码中删除了所有与我的问题无关的内容。
////edit2:在Django中添加了HTML文件,典型的工作流是首先运行验证器,以验证您试图提交到数据库中的数据是否“干净”,然后才调用
save()
。但是,由于某些特殊情况,调用
save
不会自动清除数据

因此,工作流程应该大致如下:

。。。
cv_upload=cv(律师=req.user,nume=nume,prenume=prenume,
telefon=telefon,emailContact=email)
#在保存之前调用clean,因为我们只需要数据库中的干净数据
cv_upload.full_clean()
#现在,Django的验证器和我们的自定义验证器已经相对干净了
#继续,保存它
cv_upload.save()
...

在调用
full\u clean
之前,请先调用
save
,然后尝试颠倒顺序。通常,在尝试将模型提交到数据库之前,您需要运行验证并确保模型是干净的。现在,每个值都会出现一个错误。您需要从表单而不是直接从请求中获取数据。另外,请查看表单和基于类的视图,以使代码更短,错误更少。@AKX谢谢。我会的,但现在我需要完成这个项目。