Проблемы с полем изображения при использовании в админке django - PullRequest
1 голос
/ 05 августа 2011

У меня следующий баннерный класс. Который редактируется администратором.

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 ]

1 голос
/ 05 августа 2011

Попробуйте что-то вроде этого:

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 () дважды или нет.1-й может понадобиться для сохранения файла, а 2-й - для обновления записи в БД.

0 голосов
/ 18 августа 2011

Поскольку у меня возникла проблема, связанная с сохранением изображения через администратора, я получил следующее решение, которое отвечает на все мои запросы ...

  • Сначала я обнаружил, что, хотя администратор сохраняет исходный файлname, если файл с таким именем уже существует, он продолжает добавлять счет в качестве суффикса для предотвращения дублирования имени файла ... например, если загружен тот же файл, он сохраняется как 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)

Надеюсь, это поможет вам, если у вас возникла подобная проблема.

0 голосов
/ 06 августа 2011

1) upload_to может быть вызываемым, при сохранении вы можете изменить его имя файла ( docs )

2) см. https://code.djangoproject.com/ticket/6792, Вы должны удалить его самостоятельно,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...