2010-09-29 67 views
4

自定义HTML领域,我想用Django管理一些小的定制 - 尤其是changelist_view在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的链接。 ..管理员用户可以很方便地快速导航到该项目。

另一种情况下,我会为这种事情添加链接到外部来源或图像字段的缩略图。

我以为我曾经听说过'insert html'选项 - 但也许我会领先于自己。

谢谢你的帮助!

回答

11

可以提供关于FeatureAdmin类返回的HTML content_object_change_url一个自定义的方法:

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

+0

啊哈:也许这与Django的2或readonly_fields(其表现不同于传统的领域)

这里的工作示例是工作,但是没有不SafeText()联系! 'allow_tags'...我知道这是可能的! – Daryl 2010-09-29 10:31:12

+0

现在已经在Django 2.0中更改为'mark_safe' - https://stackoverflow.com/questions/47953705/how-do-i-use-allow-tags-in-django-2-0-admin – arunkumar 2018-02-26 10:38:07

0

请注意并使用format_html(请参阅文档here),因为mark_safe util已从版本1.10开始弃用。此外,对ModelAdmin方法的allow_tags属性的支持将从版本1.11开始移除。

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

如果我尝试使用你的解决方案它不适合我,用'SafeText()'看到我的答案 – 2017-12-17 10:12:20

0

我花了两个小时才知道Daniel Roseman的解决方案为何不适合我。尽管他是对的,但有一个例外:当您想在Admin中自定义计算字段(只读)时。这不会工作。非常简单的解决方案(但很难找到)是在特殊的构造函数中返回字符串: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',) 
     }), 
    )