我有一个以下的Banner课程。哪个可由管理员编辑。
class Banner(models.Model):
name = models.CharField(max_length = 128)
link = models.TextField(max_length = 450)
image = models.ImageField(upload_to = 'banner_images')
有两个问题。
任何建议都会有所帮助。提前谢谢。
答案 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)
希望如果您遇到类似问题,这会对您有所帮助。