django管理员:如何在change_form.html中创建一个可点击只读url字段?

kx1ctssn  于 2023-02-14  发布在  Go
关注(0)|答案(4)|浏览(126)

我想在change_form页面的admin中创建一个可点击的只读URL字段。我尝试了一个小部件,但很快意识到小部件只用于表单字段。所以,在我尝试用jQuery(查找和替换或其他)解决这个问题之前,我想知道在python中是否有更优雅的解决方案。有什么想法吗?

aiqt4smr

aiqt4smr1#

老问题了,但还是值得回答。
参考文档,readonly_fields现在也支持这些定制方式,工作原理和the link在评论中发布的一样:

def the_callable(obj):
    return u'<a href="#">link from the callable for {0}</a>'.format(obj)
the_callable.allow_tags = True

class SomeAdmin(admin.ModelAdmin):
    def the_method_in_modeladmin(self, obj):
         return u'<a href="#">link from the method of modeladmin for {0}</a>'.format(obj)
    the_method_in_modeladmin.allow_tags = True

    readonly_fields = (the_callable, 'the_method_in_modeladmin', 'the_callable_on_object')

ObjModel.the_callable_on_object = lambda self, obj: u'<a href="#">link from the callable of the instance </a>'.format(obj)
ObjModel.the_callable_on_object.__func__.allow_tags = True

然后,上面的代码将在其变更表单页面中呈现三个只读字段。

cig3rfwq

cig3rfwq2#

更新后的答案可在this post中找到。
它使用format_html实用程序,因为allow_tags已被弃用。
另外,ModelAdmin.readonly_fields的文档也非常有用。

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

class SomeAdmin(admin.ModelAdmin):
    readonly_fields = ('my_clickable_link',)

    def my_clickable_link(self, instance):
        return format_html(
            '<a href="{0}" target="_blank">{1}</a>',
            instance.<link-field>,
            instance.<link-field>,
        )

    my_clickable_link.short_description = "Click Me"
bvuwiixz

bvuwiixz3#

我按照okm提供的链接,我设法在更改表单页面中包含一个可点击的链接。
我的解决方案(添加到admin.ModelAdmin,而不是models.model)

readonly_fields = ('show_url',)
fields = ('show_url',)

def show_url(self, instance):
    return '<a href="%s">%s</a>' % ('ACTUAL_URL' + CUSTOM_VARIABLE, 'URL_DISPLAY_STRING')
show_url.short_description = 'URL_LABEL'
show_url.allow_tags = True
cx6n0qe3

cx6n0qe34#

在www.example.com中admin.py

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

   class Document(admin.ModelAdmin):
      readonly_fields = ["Document_url"]

      def Document_url(self, obj):
            return format_html("<a target='_blank',href='{url}'>view</a>",url=obj.document_url)

相关问题