2012-05-03 99 views
0

我有以下模型类如何处理

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

它正在完美的插入和更新两个,现在我在Django形式的ImageField更新试图加载已经在窗体中上传的图像(例如,我已经添加了一个图像类别,现在我想上传另一个图像,所以我试图显示先前上传的图像的预览)

我传递的数据在视图中,并试图在形式

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()采用在(给定的3)最2个参数

脚本来处理图像上载被如下

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

尝试使寿命容易使用的ImageField

类的ImageField(** kwargs)¶

  • 默认插件:ClearableFileInput
  • 空值:无
  • 规一化到:一个包装了UploadedFile的对象将文件内容和文件名称合并为一个对象。
  • 验证文件数据是否已绑定到表单,并且该文件是PIL可以理解的图像格式。
  • 错误消息按键:必须的,无效的,丢失的,空的,invalid_image

    使用一个ImageField的需要安装Python图像库。

    当您在窗体上使用ImageField时,还必须记住将文件数据绑定到窗体。

检查出完整的文档here