django admin changelist_view 中的自定义 html 字段

Posted

技术标签:

【中文标题】django admin changelist_view 中的自定义 html 字段【英文标题】:custom html field in the django admin changelist_view 【发布时间】:2011-04-18 17:22:16 【问题描述】:

我想使用 django 管理员进行一些小定制——尤其是 changelist_view

class FeatureAdmin(admin.ModelAdmin):
    list_display = (
        'content_object_change_url',
        'content_object',
        'content_type',
        'active',
        'ordering',
        'is_published',
    )

    list_editable = (
       'active',
       'ordering',
    )

    list_display_links = (
        'content_object_change_url',
    )

admin.site.register(get_model('features', 'feature'), FeatureAdmin)

这个想法是'content_object_change_url' 可以是另一个对象的change_view 的链接...方便管理员用户快速直接导航到该项目。

我对这种事情的另一种情况是添加指向外部资源的链接或图像字段的缩略图。

我以为我听说过“插入 html”选项——但也许我走得太远了。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以在FeatureAdmin 类上提供自定义方法,该方法返回content_object_change_url 的HTML:

class FeatureAdmin(admin.ModelAdmin):

    [...]

    def content_object_change_url(self, obj):
        return '<a href="%s">Click to change</a>' % obj.get_absolute_url()
    content_object_change_url.allow_tags=True

见the documentation。

【讨论】:

现在在 Django 2.0 中已更改为 mark_safe - ***.com/questions/47953705/…【参考方案2】:

注意并使用 format_html(请参阅文档 here),因为 mark_safe 实用程序自 1.10 版以来已被弃用。此外,自 1.11 版起,对 ModelAdmin 方法的 allow_tags 属性的支持将被移除。

from django.utils.html import format_html
from django.contrib import admin

class FeatureAdmin(admin.ModelAdmin):
    list_display = (
        'change_url',
        [...]
    )
    def change_url(self, obj):
        return format_html('<a target="_blank" href="">Change</a>', obj.get_absolute_url())
    change_url.short_description='URL'

【讨论】:

【参考方案3】:

我花了两个小时才弄清楚为什么 Daniel Roseman 的解决方案对我不起作用。即使他是对的,也有一个例外:当您想在Admin 中创建自定义计算字段(只读)时。这行不通。非常简单的解决方案(但很难找到)是在一个特殊的构造函数中返回你的字符串:SafeText()。也许这与 Django 2 或 readonly_fields 相关联(其行为与经典字段不同)

这是一个有效的示例,但没有SafeText()

from django.utils.safestring import SafeText

class ModelAdminWithData(admin.ModelAdmin):

    def decrypt_bin_as_json(self, obj):
        if not obj:
            return _("Mode insert, nothing to display")
        if not obj.data:
            return _("No data in the game yet")
        total = '<br/><pre></pre>'.format(
            json.dumps(json.loads(obj.data),
                       indent=4).replace(' ', '&nbsp;'))
        return SafeText(total)  # !! working solution !! <------------------

    decrypt_bin_as_json.short_description = _("Data")
    decrypt_bin_as_json.allow_tags = True

    readonly_fields = ('decrypt_bin_as_json',)

    fieldsets = (
        (_('Data dump'), 
            'classes': ('collapse',),
            'fields': ('decrypt_bin_as_json',)
        ),
    )

【讨论】:

以上是关于django admin changelist_view 中的自定义 html 字段的主要内容,如果未能解决你的问题,请参考以下文章

django 配置管理后台,出现多个 admin/admin/admin

django1.6 admin不能登录

django 自带的admin登录页面可以换自己做的登录页面吗?

django admin能加逻辑操作吗?

django的admin界面怎么没有样式

怎么使用django里面admin的部分内容