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 %}
Вы можете иметь всевозможные методы на модели, чтобы облегчить свою жизнь и проект.