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

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

我在视图中传递了数据,并在表单中尝试了一些技巧

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

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

4

1 回答 1

1

尝试使用 ImageField 让生活变得轻松

类 ImageField(**kwargs)¶

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

    使用 ImageField 需要安装 Python Imaging Library。

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

在此处查看完整的文档

于 2012-05-03T11:57:13.297 回答