Django admin: как сделать поле readlly url clickable в файле change_form.html?
Я хочу, чтобы поле URL только для чтения можно было щелкнуть в admin на странице change_form. Я попробовал виджет, но вскоре реализованные виджеты были только для полей формы. Итак, прежде чем я попытаюсь решить эту проблему с помощью jQuery (найти и заменить или что-то еще), я хотел бы знать, есть ли более элегантное решение для этого в python. Любые идеи?
Ответы
Ответ 1
Старый вопрос, но по-прежнему заслуживает ответа.
Ref doc,
readonly_fields
также поддерживает эти способы настройки сейчас, работает так же, как ссылка, размещенная в комментарии:
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
Приведенный выше код будет отображать три поля только для чтения на странице формы изменения.
Ответ 2
Я следил за ссылкой, предоставленной okm, и мне удалось включить ссылку с возможностью клика на странице смены формы.
Мое решение (Добавить в admin.ModelAdmin, NOT 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
Ответ 3
Обновленный ответ можно найти в этом сообщении.
Он использует утилиту 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"