在我的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可以从相同的功能中受益)?
答案 0 :(得分:2)
您可能希望查看自定义ImageField,它将在其clean方法中处理您的自定义处理。例如,请查看此内容:https://djangosnippets.org/snippets/2206/
答案 1 :(得分:0)
我会通过覆盖clean方法并检查它来在表单类本身中完成它。 当你从视图中调用is_valid()时,它会调用clean方法来执行此检查。