Django如何检测表单字段是否被填入?

时间:2016-03-23 03:45:22

标签: django django-models django-forms

在我的models.py中,我覆盖save()以在保存之前操纵ImageField。

class Image(models.Model):
    caption = models.Charfield(max_length=254)
    image = models.ImageField(upload_to='')

    def save(self, *args, **kwargs):
        if self.image:
            # image manipulations
            super(Image, self).save(*args, **kwargs)

如果在不更改ImageField的情况下保存对象,则不应在图像上运行操作,即用户更改其他字段(如CharField)并更新对象。我没有对此进行测试,但我认为在上面的代码中,即使用户保存而不上传新图像来替换旧图像,self.image也将始终为True。

因此,我打算根据用户是否上传图像文件来检查这一点:

if form.is_valid():
    instance = form.save(commit=False)
    if form.cleaned_data.get('image'):
        image_was_uploaded = True
    instance.save(image_was_uploaded=image_was_uploaded)

这是实现此目的的有效方法,还是有更好/更多Pythonic方法(希望在models.py内有效,因此Admin和DRF可以从相同的功能中受益)?

2 个答案:

答案 0 :(得分:2)

您可能希望查看自定义ImageField,它将在其clean方法中处理您的自定义处理。例如,请查看此内容:https://djangosnippets.org/snippets/2206/

答案 1 :(得分:0)

我会通过覆盖clean方法并检查它来在表单类本身中完成它。 当你从视图中调用is_valid()时,它会调用clean方法来执行此检查。