Django - 使用动态参数上传后过程图像

时间:2011-02-01 11:36:02

标签: django django-models

我想让用户能够使用用户定义的参数(宽度,高度,压缩等)来处理上传的图像。

我想在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参数。这可能吗?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

我认为在这种情况下,您几乎不得不在form.save()中放置handle_uploaded_media(),或者从form.save()调用它以便能够传入用户 - 提供的价值观。

通过从信号调用handle_uploaded_media(),你没有真正获得任何东西,除了使表单中的值传递复杂化。如果它是您从form.save调用的单独方法,您仍然可以与其他模型/方法等共享它。

我的$ 0.02