Django的.通过ModelAdmin覆盖更改页面中FileField字段的html格式 [英] Django. Override the html format of a FileField field in the change page via ModelAdmin

查看:39
本文介绍了Django的.通过ModelAdmin覆盖更改页面中FileField字段的html格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的示例代码(并查看屏幕截图):

This is my sample code (and see the screenshot):

models.py

models.py

class User(models.Model):

    # the variable to take the inputs
    user_name = models.CharField(max_length=100)
    user_avatar = models.FileField(upload_to = 'images/%Y%m%d')

admin.py

class UserAdmin(admin.ModelAdmin):

    exclude = ('user_avatar',)  
    readonly_fields = ('avatar_readonly',)  

    def avatar_readonly(self, instance):
        value_link = "/mediafileupdown/download/" + str(instance.id)
        value_desc = str(instance.user_avatar.name)
        return format_html('<a href="{}">{}</a>', value_link, value_desc)  
    avatar_readonly.short_description = "User avatar (read only)"
    avatar_readonly.allow_tags=True

屏幕截图

问题是:我想通过我的下载"视图而不是简单的URL获得当前" user_avatar的链接(即models.FileField字段).如果该字段位于"readonly_fields"列表中,则可以这样做,因此我可以覆盖html格式...在这种情况下,在更改页面上,"avatar_readonly"链接重定向到下载"视图.问题是:当不在readonly_fileds列表中时,如何在FileField(如"user_avatar")中获得相同的结果(覆盖html格式)?

The problem is: i'd like obtain the 'Currently' user_avatar's link (that's a models.FileField field) via the my 'download' views and not as simple url. I can do that if the field is in the 'readonly_fields' list and so I can overide the html format ... in that case, on the change page, the 'avatar_readonly' link is redirected to the my 'download' view. The question is: how can I get the same result (overide the html format) in a FileField (like my 'user_avatar') when is not in the readonly_fileds list?

对不起,我的英语水平,非常感谢您的帮助.

Sorry for my english and many Thanks for the help.

推荐答案

您可以使用

You can use formfield_overrides to modify the AdminFileWidget. This AdminFileWidget can display images and mp4 files, but you can use only for images omitting the if file_name[-4:] == '.mp4': part.

from django.db.models.fields.files import FileField
from django.contrib.admin.widgets import AdminFileWidget


class AdminMediaWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):
            image_url = value.url
            file_name = str(value)
            if file_name[-4:] == '.mp4':
                output.append('<video width="320" height="240" controls>'
                              '<source src="{0}" type="video/mp4">'
                              'Your browser does not support the video tag.'
                              '</video>'.format(image_url))
            else:
                output.append('<a href="{0}" target="_blank">'
                              '<img height=200 src="{1}" alt="{2}" />'
                              '</a>'.format(image_url, image_url, file_name))

        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(''.join(output))


class UserAdmin(admin.ModelAdmin):
    formfield_overrides = {
        FileField: {'widget': AdminMediaWidget},
    }

    exclude = ('user_avatar',)  
    readonly_fields = ('avatar_readonly',)  

    def avatar_readonly(self, instance):
        value_link = "/mediafileupdown/download/" + str(instance.id)
        value_desc = str(instance.user_avatar.name)
        return format_html('<a href="{}">{}</a>', value_link, value_desc)  
    avatar_readonly.short_description = "User avatar (read only)"
    avatar_readonly.allow_tags=True

希望有帮助!

这篇关于Django的.通过ModelAdmin覆盖更改页面中FileField字段的html格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆