2010-09-29 1 views
4

Я хотел бы какие-нибудь настройки с Джанго администратором - особенно changelist_viewпользовательского HTML поля в 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. .. удобство для пользователя admin для быстрого перехода непосредственно к элементу.

В другом случае, который я использовал бы для этого, добавляются ссылки на внешние источники или миниатюры полей изображений.

Я думал, что слышал о опции «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

Ах ха! «allow_tags» ... Я знал, что это возможно! – Daryl

+0

теперь изменен на 'mark_safe' в Django 2.0 - https://stackoverflow.com/questions/47953705/how-do-i-use-allow-tags-in-django-2-0-admin – arunkumar

0

Обратите внимание и используйте format_html (см. Документы here), поскольку mark_safe util устарел с версии 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

Если я попытаюсь используйте свое решение, это не работает для меня, см. мой ответ с 'SafeText()' –

0

Мне потребовалось два часа, чтобы выяснить, почему решение Даниэля Роземана не работает для меня. Несмотря на то, что он прав, есть одно исключение: когда вы хотите создавать собственные расчетные поля (только) в Admin. Это не сработает. Очень простое решение (но трудно найти) - вернуть строку в специальный конструктор: SafeText(). Может быть, это связано с Джанго 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',) 
     }), 
    )