django admin changelist_view中的自定义html字段

问题描述 投票:4回答:3

我想用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'选项 - 但也许我已经超越了自己。

谢谢您的帮助!

django django-admin django-urls
3个回答
11
投票

您可以在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


1
投票

请注意并使用format_html(请参阅docs here),因为自1.10版以来,mark_safe util已被弃用。此外,自版本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'

0
投票

我花了两个小时才发现为什么丹尼尔罗斯曼的解决方案对我不起作用。即使他是对的,也有一个例外:当你想在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',)
        }),
    )
© www.soinside.com 2019 - 2024. All rights reserved.