Python: Делаем post.file.url уникальным для файлов изображений и видео

Я работал над сайтом социальной сети, где можно загружать изображения и видео и следить за другими пользователями.

Мне удалось загрузить и отобразить загруженные файлы на сайте.

Я использовал FileField для загрузки изображений и видео файлов, но когда я внедряю его в свой шаблон, он показывает оба пробела, потому что оба используют один и тот же источник url {{ source.file.url }}

models.py

class Post(models.Model):
    title = models.CharField(max_length=150)
    file =  models.FileField(upload_to='uploads/%Y-%m-%d')

feeds.html

{% if post.file.url %}
    <video class="video-context" width="500px" height="500px" controls>
      <source src="{{ post.file.url }}" type="video/mp4">
  </video>
  {% endif %}



  {% if post.file.url %}
  <img class="image-context" src="{{ post.file.url }}" type="image/jpg" type="image/jpeg">
  {% endif %}

показывает скриншот пустой видеоплеер над img

Я попробовал форму if endswith:

{% if file.endswith .mp4 %}
    <video class="video-context" width="500px" height="500px" controls>
      <source src="{{ post.file.url }}" type="video/mp4">
  </video>
  {% endif %}
  {% if file.endswith .jpg/jpeg %}
    <img class="image-context" src="{{ post.file.url }}">
  {% endif %}

Но это не сработало.

Как я могу просто отобразить загруженный файл. Как я могу сделать {{ post.file.url }} уникальным для изображения и видео, чтобы его было легче различать?

Как можно различать типы загрузки, но при этом использовать FileField?

Фильтр шаблонов Django "endswith" не дает вам расширение файла в вашем поле file. Вместо этого он выдает последний символ объекта, поэтому в вашем случае он вернет 4, если файл относится к типу видео, или вернет g, если файл является изображением.

Вы хотите получить расширение загружаемого файла, и, к сожалению, в шаблонах Django нет фильтра для этого.

Вам нужно создать функцию в ваших моделях, которая будет возвращать тип/расширение вашего файла.

Models.py

import os

class Post(models.Model):
    title = models.CharField(max_length=150)
    file =  models.FileField(upload_to='uploads/%Y-%m-%d')

    def extension(self):
        title, extension = os.path.splitext(self.file.name)
        return extension

Затем в ваших шаблонах вы можете получить расширение через этот код...

{% for post in posts %}

   {% if post.extension == '.mp4'%}
      <video class="video-context" width="500px" height="500px" controls>
         <source src="{{ post.file.url }}" type="video/mp4">
      </video>
   {% elif post.extension == '.jpg' or post.extension == '.jpeg' %}
      <img class="image-context" src="{{ post.file.url }}">
   {% endif %}
{% endfor %}

Вы можете иметь всевозможные методы на модели, чтобы облегчить свою жизнь и проект.

Вернуться на верх