Как проверить, существует ли файл в медиа-папке? - PullRequest
1 голос
/ 22 марта 2020

Здесь я успешно загрузил файлы в базу данных (работает нормально). Проблема заключается в том, что файл хранится в базе данных, и если в случае удаления папки мультимедиа возникнет ошибка [WinError 2] The system cannot find the file specified: ... Поэтому мой вопрос заключается в том, как я могу обработать эту ошибку.

Если файл находится в базе данных но не в папке media, тогда я хочу обработать эту ошибку и отобразить шаблон без ошибок. Как я могу это сделать?

шаблон

{% for document in documents %}
 <tr>
<td>{{forloop.counter}}</td>
 <td>{{document.filename|truncatechars:15}}</td>
 <td>{{document.file.size|filesizeformat}}</td>
 <td>{{document.category}}</td>
 <td>{{document.file.url}}</td>
<tr>
{% endfor %}

модели

class Document(models.Model):
    category = models.ForeignKey(DocumentCategory, on_delete=models.CASCADE)
    file = models.FileField(upload_to='media/',
                            validators=[FileExtensionValidator(['pdf', 'xlsx', 'pptx', 'docx','xls']), file_size])
    created = models.DateTimeField(auto_now_add=True)


    @property
    def filename(self):
        return os.path.basename(self.file.name)           

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Вы можете использовать default_storage.exists (путь), чтобы определить это.

 from django.core.files.storage import default_storage
 path = 'path/to/file'
 default_storage.exists(path)

Но обратите внимание, что ваш путь должен быть в папке проекта.

, если файл существует в пути тогда функция возвращает True, иначе False

, и в Django FileFeild есть атрибут пути для получения пути.

0 голосов
/ 22 марта 2020
  1. Django не предназначен для показа мультимедийных файлов на Prod, поэтому дополнительный код, связанный с чтением обычных мультимедийных файлов, не имеет большого смысла

  2. self.file.name содержит путь относительно относительно MEDIA_ ROOT, поэтому реализованный подход не совсем корректен

  3. , поскольку вы знаете о os.path, неясно о чем вы на самом деле спрашиваете; есть метод path.exists, и более конкретно c os.path.isfile

  4. исключения могут быть перехвачены блоком try-except, как и любые другие исключения в python.

    try:
        # Do something with the file
    except IOError:
        # Do something in case of error
...