Martin Massera
Martin Massera

Reputation: 1912

Displaying HTML fields in django admin change list

Is there a way to use HTML in fields in a model's admin's change_list template?

For example: I would like to make the Site domain column clickable, and to be able to navigate to that site:

enter image description here

Upvotes: 12

Views: 14583

Answers (3)

Rahul Gupta
Rahul Gupta

Reputation: 47896

You can create a function clickable_site_domain() which returns a HTML link as per the value of site_domain. Then you need to add this method name to the ModelAdmin.list_display attribute. Finally, you need to mark the string safe to avoid HTML escaping with mark_safe.

Prior to Django 1.9, you would need to set allow_tags=True for this function to avoid HTML escaping. (Docs)

from django.utils.text import mark_safe # Older versions
from django.utils.html import mark_safe # Newer versions


class MyModelAdmin(admin.ModelAdmin):

    list_display = (..,'clickable_site_domain', ..) # add the custom method to the list of fields to be displayed.

    def clickable_site_domain(self, obj):
        # return HTML link that will not be escaped
        return mark_safe(
            '<a href="%s">%s</a>' % (obj.site_domain, obj.site_domain)
        )

Upvotes: 27

rowman
rowman

Reputation: 1626

A more recent answer as of 2019 in django 2.2

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

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    list_display = [..., 'custom_field', ...]

    def custom_field(self, obj):
        return format_html('<a href={}>URL</a>', obj.url)

Upvotes: 12

Jmills
Jmills

Reputation: 2422

Should be doable in ModelAdmin.

Edit: See this section for how options are defined in the ModelAdmin, and then just do that appropriately when you register in admin.py, making sure your template exists, so for example:

from django.contrib import admin
from .models import MyModel

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    change_list_template = 'myapp/mymodel_change_list.html'

Upvotes: -4

Related Questions