我想让用户能够使用用户定义的参数(宽度,高度,压缩等)来处理上传的图像。
我想在pre_save信号中操作图像:
class Media(models.Model):
id = models.AutoField(primary_key=True)
file = models.FileField(upload_to='uploads/%m-%Y/')
content_type = models.CharField(max_length=100, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True, editable=False)
class MediaForm(ModelForm):
class Meta:
model = Media
def save(self, force_insert=False, force_update=False, commit=True):
m = super(MediaForm, self).save(commit=False)
m.content_type = self.cleaned_data['file'].content_type
if commit:
m.save()
def handle_uploaded_media(sender, instance, *args, **kwards):
# Use PIL to process media here (depending on type)
models.signals.pre_save.connect(handle_uploaded_media, sender=Media)
我遇到的问题是我无法从表单save方法将参数传递给pre_save处理程序。我想要的是能够做这样的事情:
if request.method == 'POST':
form = MediaForm(request.POST, request.FILES)
if form.is_valid():
form.save({'width':500, 'height':500, 'compression':60})
因为它干净整洁,我显然可以用用户定义的值替换save参数。这可能吗?有没有更好的方法呢?
答案 0 :(得分:1)
我认为在这种情况下,您几乎不得不在form.save()中放置handle_uploaded_media(),或者从form.save()调用它以便能够传入用户 - 提供的价值观。
通过从信号调用handle_uploaded_media(),你没有真正获得任何东西,除了使表单中的值传递复杂化。如果它是您从form.save调用的单独方法,您仍然可以与其他模型/方法等共享它。
我的$ 0.02