Проверка файла Django с помощью специального валидатора работает не так, как я ожидал - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь создать форму с некоторыми данными и файлом, который необходимо загрузить.Я хочу ограничить размер файла до 5 МБ и не могу понять, как это сделать.

Я пытался использовать файл validators.py и запустить .validate () и .run_validators ()но я не заставил это работать.Я покажу вам некоторый код.

views.py

from django.shortcuts import render
from .models import Oferta, CV
from django.contrib import messages

# Create your views here.
def incarcareoferta(req):
    context = {
        'title': "Incarcare oferta de munca | Best DAVNIC73"
    }
    if req.method == 'POST':
        try:
            COR = req.POST['COR']
            denumireMeserie = req.POST['denumireMeserie']
            locuri = req.POST['numarLocuri']
            agentEconomic = req.POST['agentEconomic']
            adresa = req.POST['adresa']
            dataExpirare = req.POST['expirareOferta']
            experientaSolicitata = req.POST['experienta']
            studiiSolicitate = req.POST['studii']
            judet = req.POST['judet']
            telefon = req.POST['telefon']
            emailContact = req.POST['email']
            cerere = Oferta(solicitant=req.user, cor=COR, denumireMeserie=denumireMeserie, locuri=locuri, agentEconomic=agentEconomic, adresa=adresa, dataExpirare=dataExpirare, experientaSolicitata=experientaSolicitata, studiiSolicitate=studiiSolicitate, judet=judet, telefon=telefon, emailContact=emailContact)
            cerere.save()
        except:
            messages.error(req, 'Nu ai completat corect campurile sau unul din ele este liber!')            
    return render(req, "../templates/pagini/incarcare-oferta-de-munca.html", context)

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:
                cv_upload = CV(
                solicitant=req.user,
                nume=nume,
                prenume=prenume,
                telefon=telefon,
                emailContact=email
                )
                CV.run_validators()
                cv_upload.CV.save(cv.name, cv)
                cv_upload.save()
            except (ValueError):
                messages.error(req, 'Formularul nu a fost incarcat!')
                messages.info(req, 'Verifica daca esti logat, sau daca ai completat campurile corect!')
            except:
                messages.error(req, 'Formularul nu a fost incarcat. Ceva nu a functionat corect!')
        except:
            messages.error(req, 'Nu ai completat corect campurile sau unul din ele este liber!')
    return render(req, "../templates/pagini/incarcare-cv.html", context)

validators.py

from django.core.exceptions import ValidationError


def validate_file_size(value):
    filesize=value.size

    if filesize > 524288000:
        print('too big')
        raise ValidationError(_('Invalid value'), code='invalid')
    else:
        return value

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=12)
    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)
    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)
    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)

Ноэто ничего не делает.Я также попытался

from django.shortcuts import render
from .models import Oferta, CV
from django.contrib import messages

# Create your views here.
def incarcareoferta(req):
    context = {
        'title': "Incarcare oferta de munca | Best DAVNIC73"
    }
    if req.method == 'POST':
        try:
            COR = req.POST['COR']
            denumireMeserie = req.POST['denumireMeserie']
            locuri = req.POST['numarLocuri']
            agentEconomic = req.POST['agentEconomic']
            adresa = req.POST['adresa']
            dataExpirare = req.POST['expirareOferta']
            experientaSolicitata = req.POST['experienta']
            studiiSolicitate = req.POST['studii']
            judet = req.POST['judet']
            telefon = req.POST['telefon']
            emailContact = req.POST['email']
            cerere = Oferta(solicitant=req.user, cor=COR, denumireMeserie=denumireMeserie, locuri=locuri, agentEconomic=agentEconomic, adresa=adresa, dataExpirare=dataExpirare, experientaSolicitata=experientaSolicitata, studiiSolicitate=studiiSolicitate, judet=judet, telefon=telefon, emailContact=emailContact)
            cerere.save()
        except:
            messages.error(req, 'Nu ai completat corect campurile sau unul din ele este liber!')            
    return render(req, "../templates/pagini/incarcare-oferta-de-munca.html", context)

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:
                cv_upload = CV(
                solicitant=req.user,
                nume=nume,
                prenume=prenume,
                telefon=telefon,
                emailContact=email
                )
                cv_upload.CV.save(cv.name, cv)
                cv_upload.save()
            except (ValueError):
                messages.error(req, 'Formularul nu a fost incarcat!')
                messages.info(req, 'Verifica daca esti logat, sau daca ai completat campurile corect!')
            except (invalid):
                messages.error(req, 'File is too big!')
            except:
                messages.error(req, 'Formularul nu a fost incarcat. Ceva nu a functionat corect!')
        except:
            messages.error(req, 'Nu ai completat corect campurile sau unul din ele este liber!')
    return render(req, "../templates/pagini/incarcare-cv.html", context)

Поскольку я думал, что ошибка будет из validators.py

Ничего не работает.

Так как я могу ограничить размер файла, используя этокод?Что я делаю не так прямо сейчас?Спасибо.

1 Ответ

0 голосов
/ 06 июня 2019

Как указано в документации по валидаторам [Django-doc] :

(...) Обратите внимание, что валидаторы не будут запускаться автоматически при сохранениимодель , но если вы используете ModelForm, он будет запускать ваши валидаторы в любых полях, включенных в вашу форму.(...)

Вы можете вручную подтвердить свою модель, позвонив по номеру Model.full_clean(..) [Django-doc] :

try:
    cv_upload = CV(
        solicitant=req.user,
        nume=nume,
        prenume=prenume,
        telefon=telefon,
        emailContact=email
    )
    cv_upload.CV.save(cv.name, cv)
    <b>cv_upload.full_clean()</b>
    cv_upload.save()
except (ValueError):
    messages.error(req, 'Formularul nu a fost incarcat!')
    messages.info(req, 'Verifica daca esti logat, sau daca ai completat campurile corect!')
except (invalid):
    messages.error(req, 'File is too big!')
except:
    messages.error(req, 'Formularul nu a fost incarcat. Ceva nu a functionat corect!')

Но я действительно советую использовать ModelForm [Django-doc] здесь.Модельные формы проще в управлении, они удаляют большое количество шаблонного шаблона, и, кроме того, если форма недействительна, они возвращают пакет ошибок, а не одну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...