Файловый браузер Django, параметр каталога для конкретной модели для FileBrowserField

Используя django-filebrowser и FileBrowserField, я пытаюсь назначить параметр directory на основе ключа в самой модели. Итак, используя пример блога, если бы я сохранял фотографии для разных сообщений, фотографии были бы в каталогах, названных в честь идентификатора блога. Итак, если MEDIA_ROOT было/some/path/to/media/filebrowser_files/, я хочу динамически назначить параметру directory значение MEDIA_ROOT+str(model_pk).

На данный момент я попытался сделать что-то вроде следующего, но не понимаю, как получить идентификатор текущего объекта. (Исключение DoesNotExist с «Исключение не предоставлено») Я знаю, что ошибка существует при попытке использовать self.page, но я не знаю, как это сделать правильно. Может ли кто-нибудь дать некоторое представление о том, где моя логика ошибочна и что я могу сделать, чтобы это исправить? Спасибо большое.

class PageImage(models.Model):
    page = models.ForeignKey(Page)
    page_photo = FileBrowseField("Image", max_length=200, blank=True, null=True)
    def __init__(self, *args, **kwargs):
        super(PageImage, self).__init__(*args, **kwargs)
        path = settings.MEDIA_ROOT+'pages/unfiled/'
        if self.page:
            path = settings.MEDIA_ROOT+'pages/'+str(self.page)+'/'
        if not os.path.exists(path):
            os.makedirs(path)
        self._meta.get_field_by_name("page_photo")[0].directory = path

person wilbbe01    schedule 27.10.2011    source источник


Ответы (1)


Я понимаю, что не присмотрелся к вашему коду. self.page не будет работать, потому что вы инициализируете экземпляр модели, а self.page не был установлен на страницу в базе данных. Вместо этого вы должны попробовать:

class PageImage(models.Model):
    page = models.ForeignKey(Page)
    page_photo = FileBrowseField("Image", max_length=200, blank=True, null=True)

    def save(self, *args, **kwargs):

        path = settings.MEDIA_ROOT+'pages/unfiled/'
        if self.page:
            path = settings.MEDIA_ROOT+'pages/'+str(self.page)+'/'
        if not os.path.exists(path):
            os.makedirs(path)
        self._meta.get_field_by_name("page_photo")[0].directory = path
        super(PageImage, self).save(*args, **kwargs)

делать то, что вы хотите, только после того, как вы назначили страницу полю в PageImage.

person Kenny Shen    schedule 27.10.2011
comment
Спасибо за ответ. В модели Page нет ничего необычного. Я считаю, что проблема заключается в использовании self, поскольку я могу удалить все, кроме вызова super init и print(str(self.page)). Вот где я получаю исключение DoesNotExist, в котором говорится, что исключение не предоставлено. Я не переопределяю pk. - person wilbbe01; 27.10.2011
comment
Спасибо за обновленный ответ. По крайней мере, это заставляет меня делать то, что я пытался сделать, но я думаю, что мне нужно переосмыслить, как я это делаю. Настройка directory мало что дает при сохранении, так как изображение уже загружено... поэтому мне, возможно, потребуется переместить изображения из того места, где они были загружены при сохранении. Управление файлами... весело. Спасибо еще раз. - person wilbbe01; 28.10.2011