Django ImageField不验证图像

时间:2020-07-11 23:03:27

标签: django django-forms

我可以上载代码,但是它是一个非常基本的形式,具有一个ImageField和一个带有and ImageField的Model,但是我可以上载任何文件类型。我已经安装了PIL,并且已成功将上载的文件写入媒体目录,但是正如我所说,它们可以是我喜欢的任何文件,因为似乎没有进行验证。

已添加更新,对不起,我之前没有这样做。

观看次数。

from django.shortcuts import render
from .forms import QuoteForm, ImageForm
from django.http import HttpResponse
from django.core.mail import EmailMessage
from django.shortcuts import redirect
from django.template.loader import get_template
from .models import Quote, Image, Job
from django.forms import modelformset_factory
from django.contrib import messages
from django.http import HttpResponseRedirect


def job_index(request):
    jobs = Job.objects.all()
    context = {
        'jobs':jobs
    }
    return render (request, 'about.html', context)

def quote(request):

    if request.method == 'POST':
        form = QuoteForm(request.POST)
        files = request.FILES.getlist('image')

        if form.is_valid():
            quote_form = form.save(commit=False)
            quote_form.save()
            messages.success(request, 'Form submission successful')
            HttpResponse('image upload success')
            form=QuoteForm()

            for f in files:
                Image.objects.create(quote=quote_form, image = f)



        else:
            print("Oh Know")

    else:
        form = QuoteForm()

    context ={
        'form': form,


    }
    
    return render (request, 'quote.html', context)

表格


from django import forms
from .models import Quote, Image
from django.core.exceptions import ValidationError
from django.core import validators
from django.utils.translation import gettext_lazy as _
import csv
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, ButtonHolder, Submit



SERVICES = [
    ('lawn', 'Lawn Mowing'),
    ('hedge', 'Hedge Triming'),
    
]


# def check_size(value):
#     if len(value)<6:
#         raise ValidationError("You fucked it")


class QuoteForm(forms.ModelForm):
    title = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "Post Code to check if we service your area"}))
    message = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "Title"}))
    date_call = forms.CharField(widget=forms.TextInput(attrs={"id":"datetimes"}))
    service = forms.ChoiceField(choices=SERVICES)
    class Meta:
        model = Quote
        fields = ('title', 'message', 'email', 'date_call', 'service')


    def clean_title(self):
        with open("/Users/Mitch/Desktop/Work/Website/db_landscaping/db_landscaping/static/postcodes.csv", mode = "r") as csvDataFile:
            csvReader = csv.reader(csvDataFile)
            title = self.cleaned_data.get("title")
            for row in csvReader:
                if title not in row:
                    raise ValidationError('Postcode invalid or we do not service your area') 
            return title






class ImageForm(forms.ModelForm):
    image = forms.ImageField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
    class Meta (QuoteForm.Meta):
        fields = QuoteForm.Meta.fields + ('image',)

模型


from django.db import models
from django.db.models.signals import pre_save
from db_landscaping import settings
import os
from django.template.defaultfilters import slugify





class Quote (models.Model):
    title = models.CharField(null=True, max_length=100)
    message = models.TextField(null=True,blank=True)
    email = models.EmailField( null=True)
    slug = models.SlugField(null=True ,unique=True )
    service = models.CharField(max_length=100, null=True)
    date_call = models.TextField(null=True)
    created_date = models.DateTimeField(null=True, auto_now_add=True)
    last_modified = models.DateTimeField(null=True, auto_now=True)

class Job (models.Model):
    title = models.CharField(null=True, max_length=100)
    message = models.TextField(null=True,blank=True)
    image = models.ImageField(upload_to="images/job",null=True,blank=True)




class Image (models.Model):
    quote = models.ForeignKey(Quote, default=None, on_delete=models.CASCADE)
    image = models.ImageField(upload_to="images/",null=True,blank=True)

    def __str__(self):
        return self.quote.title + "Image"

1 个答案:

答案 0 :(得分:0)

很确定迟到了,但如果有人遇到同样的问题,我认为您必须创建自己的验证器或使用 Django:Django.core.validators.validate_image_file_extension 并将其添加到您的模型字段,即

image = models.ImageField(upload_to="images/",null=True,blank=True, validators=[validate_image_file_extension])

这样,您上传的文件将被验证,如果没有图像,则会引发验证错误。

相关问题