Django管理员list_display具有null的不同数据类型

问题描述

我知道我对标题的解释很差,看起来我有一个简单的聊天应用程序,用户可以在其中发送文本/音频/视频/图像,并且对我来说,呈现这些消息,我有一种检查消息类型并进行呈现的方法因此,如果它是文本,那么我将在模板中将safe设置为False,否则我将显示该函数将给我的HTML代码

我真正想要的是:管理面板,给我消息文本[:50],如果是文本,如果是音频,那么我可以为其进行音频预览,如果是图像,视频或文件,则它将给出我的网址。 反正有这样做吗?

这是我的文件,因此您可以更好地了解我在说什么:

models.py:

class Message(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    room = models.ForeignKey(Room,on_delete=models.CASCADE)

    text = models.TextField(blank=True,null=True)
    video = models.FileField(upload_to="chat/room/vid",blank=True,null=True)
    image = models.FileField(upload_to="chat/room/img",null=True)
    file = models.FileField(upload_to="chat/room/file",null=True)
    audio = models.FileField(upload_to="chat/room/aud",null=True)

    is_read = models.BooleanField(default=False)
    date = models.DateTimeField(auto_now_add=True)

    def content(self):
        if self.text:
            return self.text
        elif self.video:
            return f"""
            <video width="320" height="240" controls>
                        <source src="{self.video.url}" type="video/mp4">
                        <source src="{self.video.url}" type="video/mov">
                        <source src="{self.video.url}" type="video/wmv">
                        <source src="{self.video.url}" type="video/avi">
                        <source src="{self.video.url}" type="video/avchd">
                      Your browser does not support the video tag.
                      </video> 
            """
        elif self.image:
            return f'<img src="{self.image.url}" alt="">'
        elif self.file:
            return f'<p><a href="{self.file.url}" download><i class="fas fa-download"></i> {self.filename()}</a></p>'
        elif self.audio:
            return f"""
            <audio controls>
                        <source src="{self.audio.url}" type="audio/pcm">
                        <source src="{self.audio.url}" type="audio/wav">
                        <source src="{self.audio.url}" type="audio/aiff">
                            <source src="{self.audio.url}" type="audio/mp3">
                                <source src="{self.audio.url}" type="audio/aac">
                                <source src="{self.audio.url}" type="audio/ogg">
                                <source src="{self.audio.url}" type="audio/flac">
                                <source src="{self.audio.url}" type="audio/wma">
                      Your browser does not support the audio element.
                      </audio>
            """
        else:
            return self.text

这是我的HTML模板:

{% for room_message in room_messages %}
                {% if room_message.text %}
                <p>{{ room_message.content }}</p>
                {% else %}
                {{ room_message.content|safe }}
                <br>
                {% endif %}
        {% endfor %}

现在问题出在哪里?在我的管理面板上,如果没有文字,则会给我“-”作为邮件内容

我的管理员:

from django.contrib import admin
from .models import Room,Area,Message


admin.site.register(Room)
admin.site.register(Area)
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    '''Admin View for Message'''

    list_display = ('user','room','user','is_read','text')
    readonly_fields = ('date',)

解决方法

您可以尝试拥有一个名为get_content()的功能,并将其包含在list_display中,例如

list_display = ('user','room','user','is_read','get_content')

在您的班级中拥有此功能

def get_content(self,obj):
    if obj.text:
        return obj.text
    elif obj.video:
        return obj.video.url
    elif obj.image:
        return obj.image.url
    elif obj.file:
        return obj.file.url
    elif obj.audio:
        return obj.audio.url

此方法必须在ModelAdmin类中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...