Добавьте звуковой проигрыватель в панель администратора 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 я сделал следующее:

  1. 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 ""
  1. в 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.

Похоже, что работает:

  1. Добавьте к модели 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 ""
  1. В 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
Вернуться на верх