Настраиваемое поле HTML в django admin changelist_view - PullRequest
4 голосов
/ 29 сентября 2010

Я бы хотел немного изменить настройки администратора 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» - но, возможно, я забегаю вперед.

Спасибо за вашу помощь!

Ответы [ 3 ]

11 голосов
/ 29 сентября 2010

В классе 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

См. документацию .

1 голос
/ 25 октября 2017

Обратите внимание и используйте format_html (см. Документы здесь ), поскольку утилита mark_safe устарела с версии 1.10.Более того, поддержка атрибута allow_tags в методах ModelAdmin будет удалена с версии 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 голосов
/ 17 декабря 2017

Мне потребовалось два часа, чтобы понять, почему решение Дэниэла Роузмана не работает для меня.Даже если он прав, есть одно исключение: когда вы хотите создать пользовательские вычисляемые поля ( только для чтения ) в Admin.Это не сработает.Очень простое решение (но его трудно найти) - вернуть вашу строку в специальный конструктор: SafeText().Возможно, это связано с Django 2 или с readonly_fields (который ведет себя не так, как классические поля)

Вот рабочий пример, который работает, но не работает без формата SafeText():

<code>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>{}
'.(json.dumps (json.loads (obj.data), отступ = 4) .replace ('', '')) вернуть SafeText (всего) # !!рабочий раствор !!<------------------ decrypt_bin_as_json.short_description = _ («Данные») decrypt_bin_as_json.allow_tags = True readonly_fields = ('decrypt_bin_as_json',) fieldsets = ((_ (Данныеdump '), {' classes ': (' collapse ',),' fields ': (' decrypt_bin_as_json ',)}),) </code>
...