Не удается установить атрибут URL-адреса ImageField - PullRequest
0 голосов
/ 04 марта 2011

Я хочу изменить атрибут моего ImageField, однако постоянно получаю сообщение об ошибке «Не удается установить атрибут».

Моя модель

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. Но обычно я не могу назначить какой-либо идентификатор до сохранения модели. Поэтому я создаю tmp-файл, имя которого является значением времени. Затем, чтобы добраться до папки «сообщества», я хочу переименовать этот файл. Итак, мой fix_avatar просто перемещает содержимое файла tmp в папку society_ (society_id) после сохранения общества. Пока все хорошо, все работает хорошо. Тем не менее, ImageField моего общества по-прежнему содержит ранее созданную папку. Чтобы изменить его значение, я обнаружил, что могу использовать чистый метод (из этого ТАК вопрос ) Но все же я получаю тот же результат, путь не меняется, и выдает «может установить атрибут "ответ".

Есть идеи ??

Ответы [ 2 ]

2 голосов
/ 04 мая 2013

Не уверен, изменилось ли это когда-либо в Джанго с тех пор, как был задан этот вопрос.Билет о том, что это невозможно, все еще существует: https://code.djangoproject.com/ticket/15590

Однако вы можете изменить путь, выполнив его следующим образом:

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

Что также делает работу:

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

Это сработало для нас несколько раз.

1 голос
/ 06 апреля 2011

Проблема здесь:

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

Вы не можете изменить значение атрибута пути в экземплярах FileField / ImageField, оно доступно только для чтения. Есть предложение , чтобы изменить это в Django 1.4

...