2011-03-04 109 views
0

我想更改我的ImageField属性,但是我不断收到无法设置属性错误。无法设置ImageField url属性

我的模型是

class Society(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField(unique=True) 
    summary = models.TextField(blank=True,null=True) 
    members = models.ManyToManyField(User,null=True,blank=True) 
    gallery = models.ForeignKey(Gallery,null=True,blank=True) 
    avatar = models.ImageField(upload_to=get_society_path) 

    def save(self,*args,**kwargs): 
      super(Society, self).save(*args,**kwargs) 
      fix_avatar_path(self) 

    def clean(self): 
      if self.id: 
       self.avatar.path = get_society_path(self,self.avatar.path) 
       save_thumb(self.avatar.path) 

而且帮助我的职责是:

def get_society_path(instance,filename): 
    seperator_val = instance.id 
    if seperator_val is None: 
      seperator_val = get_time() 
    return '%s/society_%s/%s' % (settings.UPLOAD_ROOT,seperator_val,time_to_name(filename)) 

def fix_avatar_path(instance): 
    org_society_path = get_society_path(instance,instance.avatar.name) 
    make_upload_dir(org_society_path) 
    move(instance.avatar.path,org_society_path) 
    os.rmdir(os.path.dirname(instance.avatar.path)) 
    instance.clean() 

的问题是:

我想我的社会目录另存为society_society_id。但通常情况下,我无法在模型保存之前分配任何ID。所以我创建一个tmp文件,其名称是一个时间值。然后到达社会文件夹,我想重命名这个文件。所以,我的fix_avatar只是在社会被保存之后将tmp文件的内容移动到society_(society_id)文件夹中。到目前为止,一切都很好。但是,我社会的ImageField仍然保存着以前创建的文件夹。为了改变它的价值,我发现我可以使用干净的方法(从这个SO question)但是我仍然得到相同的结果,路径不会改变,并给出“无法设置属性”的回应。

任何想法??

回答

1

的问题是在这里:

self.avatar.path = get_society_path(self,self.avatar.path) 

你不能改变的FileField/ImageField的情况下,路径属性的值,它是只读的。有一个proposal改变这在Django 1.4

2

不知道,如果这是因为这个问题被问到在Django曾经改变。这个不是可能的票证仍然存在:https://code.djangoproject.com/ticket/15590

但是,你实际上可以做这样的改变路径:

self.avatar = 'uploads/example/path/' 

什么也不会工作:

self.avatar.name = 'uploads/example/path/' 

它已多次为我们工作。