Добавьте звуковой проигрыватель в панель администратора django
У меня есть модель с FileField
, которая содержит аудиофайл:
class Word(models.Model):
theme = models.ManyToManyField(Theme, related_name='words')
name = models.CharField(max_length=200, null=True, blank=True)
sound = models.FileField(upload_to='sounds/', blank=True)
Мне нужно показать аудиоплеер на панели администратора для этой модели.
Например, для ImageField
я сделал следующее:
from django.utils.html import mark_safe
и добавьте свойство в код модели
@property
def icon_preview(self):
if self.icon:
return mark_safe(f'<img src="{self.icon.url}" width="100" height="100" />')
return ""
- в
admin.py
добавьте код:
list_display = ('id', 'name', 'icon', 'icon_preview')
readonly_fields = ('icon_preview',)
def icon_preview(self, item):
return item.icon_preview
icon_preview.short_description = 'icon preview'
icon_preview.allow_tags = True
И мне нужно сделать что-то подобное для звука
Возможно, вы можете поставить ссылку на аудиофайл, подобно тому, как вы сделали это для изображения, и позволить браузеру воспроизводить файл, когда пользователь щелкает по ссылке.
Например, используя format_html:
from django.utils.html import format_html
@admin.display(description='Sound', ordering='sound')
def sound_display(obj):
link = 'not available'
if obj.sound:
link = format_html('<a href="{}">sound</a>', obj.sound.url)
return link
и затем используйте его следующим образом в вашем list_display
:
list_display = (..., sound_display)
Вы также можете использовать тег HTML <audio>
, как предложил @AKX.
Похоже, что работает:
- Добавьте к модели
Word
это свойство:
@property
def sound_display(self):
if self.sound:
return mark_safe(f'<audio controls name="media"><source src="{self.sound.url}" type="audio/mpeg"></audio>')
return ""
- В
admin.py
добавьте эту конструкцию:
list_display = ('id', 'name', 'transcription', 'translation', 'example', 'sound_display')
readonly_fields = ('sound_display',)
list_display_links = ('id', 'name')
def sound_display(self, item):
return item.sound_display
sound_display.short_description = 'sound'
sound_display.allow_tags = True