我有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 ""
- in
admin.py
add code:
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