在django admin中使用时图像字段相关的问题

时间:2011-08-05 13:29:15

标签: python django django-admin

我有一个以下的Banner课程。哪个可由管理员编辑。

class Banner(models.Model):
    name        = models.CharField(max_length = 128)
    link        = models.TextField(max_length = 450)
    image       = models.ImageField(upload_to = 'banner_images')

有两个问题。

  1. 保存图像时,会以原始文件名保存。我想用一些唯一的名称来更改它,以便在指定目录中再次上传具有相同名称的图像时不会发生冲突。
  2. 更新图像时,必须删除第一个图像文件。它没有发生......
  3. 任何建议都会有所帮助。提前谢谢。

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

from os import rename
class Banner(models.Model):
    name        = models.CharField(max_length = 128)
    link        = models.TextField(max_length = 450)
    image       = models.ImageField(upload_to = 'banner_images')

    def save(self):
            super(Banner, self).save()
            new_filename = <insert code here to change name>
            self.image.name = new_filename
            rename(static_path+'banner_images/'+self.image, static_path+'banner_images/'+new_filename)
            super(Banner, self).save()

我不确定调用的super(Banner,self).save()是否需要两次。第一个可能需要保存文件,第二个可能需要更新DB记录。

答案 1 :(得分:0)

1)upload_to可以是可调用的,保存后你可以修改它的文件名(docs

2)见https://code.djangoproject.com/ticket/6792,你必须自己删除它,

答案 2 :(得分:0)

由于我遇到了与通过管理员节省图像相关的问题,我得到了以下解决方案,它可以回答我的所有问题......

  • 首先我发现即使admin保留原始文件名,如果已存在同名文件,它会继续附加一个计数作为后缀以防止重复文件名...例如,如果相同文件上传它存储为image,image_2,image_3等...

  • 其次,在通过管理员更改图像时,它没有删除原始文件。为此,我在admin.py中编写了以下代码。它做得很好......

<强>代码:

class BannerAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        #Remove the previous file if the object is not new 
        #and new file supplied.        
        if obj.id != None and len(request.FILES) > 0:

            import os
            old_obj = m.Banner.objects.get(id = obj.id)
            os.remove(old_obj.image.path)

希望如果您遇到类似问题,这会对您有所帮助。