如何处理django形式的imagefield更新

时间:2012-05-03 11:52:24

标签: python django forms model label

我有类别

的以下模型
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
  def image(self):
    return self.photo or 'DEFAULT_PIC.jpg'
  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'
   )

它非常适合插入和更新两者,现在我正在尝试加载已经在表单中上传的图像(假设我已经添加了一个带图像的类别,现在我想上传另一个图像,所以我我试图显示以前上传图片的预览)

我在视图中传递了数据,并尝试了几种形式的黑客

formdata = categoryForm({'name':p.name,'is_active':p.is_active,'id':p.id,'photo':p.image()})

在表格中我做了如下修改

def __init__(self, data=None, **kwargs):
#    pass
     super(categoryForm, self).__init__(data, **kwargs)
     if self.data['photo']!='':
        self.fields['uploaded_photo'] =forms.CharField(widget=forms.TextInput,required=False,label=mark_safe('<img src="/media/%s" height="100">'%(self.data['photo'])))
        #self.fields['uploaded_photo'].widget.attrs['value']=self.data['photo']

现在它可以完美地显示以前在标签上上传的图像。

之后我试图上传另一张图片,但显示以下错误

TypeError at /update/category/

init ()最多需要2个参数(给定3个)

处理图片上传的脚本如下

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()

请让我知道这里发生了什么

1 个答案:

答案 0 :(得分:1)

使用ImageField

尝试让生活更轻松

类ImageField(** kwargs)¶

  • 默认小部件:ClearableFileInput
  • 空值:无
  • Normalizes to:一个UploadedFile对象,它将文件内容和文件名包装到一个对象中。
  • 验证文件数据是否已绑定到表单,并且该文件是PIL理解的图像格式。
  • 错误消息键:必需,无效,缺失,空,invalid_image

    使用ImageField需要安装Python Imaging Library。

    在表单上使用ImageField时,还必须记住将文件数据绑定到表单。

查看完整的文档here