1

新手 Django 问题。我在模型上有一个 ImageField,我正在向其上传文件。上传工作正常,除了当我上传不是图像的文件时没有收到 ValidationErrors。这显然不利于安全。full_clean 非常适合我的 URLField 和 EmailField,但不适用于 ImageField。

我的模型中的内容摘要:

class Thing(models.Model):
    name = models.CharField(max_length=60, unique=True)
    email = models.EmailField(max_length=254)
    home = models.URLField()
    image = models.ImageField(upload_to=uploader, blank=True, null=True)
    admins = models.ManyToManyField(User)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(Thing, self).save(*args, **kwargs)

在我的观点和我的测试中发生的事情的摘要:

from django.core.exceptions import ValidationError
from django.test.client import Client

#In views.py
#This is the view for the URL things/[id]
#Modifies an existing model to upload an image to it

def thing(request, thing_id):
    try:
        thing = Thing.objects.get(pk=int(thing_id))
    except:
        raise Http404
    if request.method == 'POST':
        thing.image = request.FILES.get('image')
        try:
            thing.save()
        except ValidationError as e:
            return HttpResponseBadRequest("Error message here")
        return HttpResponse(status=201)



#In tests.py
#This should not work; 'tests.py' is not an image

with open('myapp/tests.py') as f:
    response = Client().post('/things/1', {'image': f})
    print response.content, response.status_code

    #I get that the HTTP status code = 201, not = 400.

我找到了大量关于如何使用表单执行此操作的信息,但我不想使用表单。我正在创建一个 REST API / Web 服务,并且不需要在任何地方的模板中嵌入表单,因此表单似乎是不必要的工作。

Django ImageField 验证(是否足够)?涵盖 ImageField 验证的工作原理,但不包括我如何实现它。

谢谢你的建议!

4

0 回答 0