ORM更新不支持文件上传

Posted

技术标签:

【中文标题】ORM更新不支持文件上传【英文标题】:ORM update does not support file upload 【发布时间】:2012-05-03 06:34:08 【问题描述】:

我有以下型号

class Category(models.Model):
    name = models.CharField(max_length=30)
    is_active=models.BooleanField()
    photo=models.ImageField(upload_to='category')
    def __unicode__(self):
       name = str(self.name)
       return name
    class Meta:
        permissions = (
            ('category','Category'),
            ('view_category', 'View category'),
        )

我的表单类如下

class categoryForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs='class':'box'),max_length=32,label='Category',required=True)
    is_active = forms.BooleanField(required=False)
    id = forms.CharField(widget=forms.HiddenInput,required=False)
    photo = forms.FileField(
            required=False,
            label='Select an Image',
            help_text='max. 4 megabytes'
            )

在 view.py 我有以下内容

formdata = categoryForm(request.POST,request.FILES)
    if formdata.is_valid():
            cd = formdata.cleaned_data
            p1=Category()
            p1.id=cd['id']
            p1.name=cd['name']
            p1.is_active=cd['is_active']
            p1.photo=cd['photo']
            p1.save()

它工作正常,但是当我将其更改为以下时,图像未上传

Category.objects.filter(id='%s'%(cd['id'])).update(name='%s'%(cd['name']),
                                    is_active='%s'%(cd['is_active']),
                                   photo=cd['photo']
                                   )

我认为第二种方法更快,但为什么它不适用于 ImageField

【问题讨论】:

【参考方案1】:

上面粘贴的代码中的id是一个字符串,试着把它转换成一个int。我猜这将使过滤器查询正常工作,从而使其更新也正常工作。

【讨论】:

过滤查询工作正常。其他字段(图片除外)正在更新【参考方案2】:

您不应该将字符串传递给is_active。只需传递布尔值,它应该可以工作。此外,您不应该编写像'%s' % string 这样的代码;你可以使用string

【讨论】:

是的,但问题仍然存在......没有使用第二种方法上传图片..请帮助我 从您的代码示例 1 看来,您正在创建一个新的 Category 对象。为什么在第二个代码示例中使用filter?你应该使用Category.objects.create(id=..., is_active=...)。有关示例,请参阅 django 文档:docs.djangoproject.com/en/1.4/ref/models/querysets/… 过滤+更新会加快执行速度,在更新查询中创建对象会首先判断该id是否存在,如果存在则更新,否则插入。【参考方案3】:

你需要使用get_or_create

【讨论】:

以上是关于ORM更新不支持文件上传的主要内容,如果未能解决你的问题,请参考以下文章

在 Doctrine ORM 中创建文件上传模板

Openresty + nginx-upload-module支持文件上传

BugkuCTF 文件上传测试

XISE WBMS V23.8

ORM中的事务和锁Ajax异步请求和局部刷新Ajax文件上传日期时间类型的Json多表查询图书系统

vue多文件上传进度条 进度不更新问题