I have this admin.py
class LawyerAdmin(admin.ModelAdmin):
fieldsets = [
('Name', {'fields': ['last', 'first', 'firm_name', 'firm_url', 'school', 'year_graduated']}),
]
list_display = ('last', 'first', 'school', 'year_graduated', 'firm_name', 'firm_url')
list_filter = ['school', 'year_graduated']
search_fields = ['last', 'school', 'firm_name']
and I want to make "firm_url" fields clickable with each of the url listed in the field. How can I do this? Thank you.
Use the format_html
utility. This will escape any html from parameters and mark the string as safe to use in templates. The allow_tags
method attribute has been deprecated in Django 1.9.
from django.utils.html import format_html
from django.contrib import admin
@admin.display(description="Firm URL")
class LawyerAdmin(admin.ModelAdmin):
list_display = ['show_firm_url', ...]
...
def show_firm_url(self, obj):
return format_html("<a href='{url}'>{url}</a>", url=obj.firm_url)
Now your admin users are safe even in the case of:
firm_url == 'http://a.aa/<script>eval(...);</script>'
See the documentation for more info.
Define a custom method in your LawyerAdmin class that returns the link as HTML:
def show_firm_url(self, obj):
return '<a href="%s">%s</a>' % (obj.firm_url, obj.firm_url)
show_firm_url.allow_tags = True
See the documentation.
add show_firm_url
to list_display
But it overrides the text display specified in my models and displays "show firm url" on the head of the column
You can change it by assigning short_description property:
show_firm_url.short_description = "Firm URL"
You can handle it in the model if you prefer:
In models.py :
class Foo(models.Model):
...
def full_url(self):
url = 'http://google.com'
from django.utils.html import format_html
return format_html("<a href='%s'>%s</a>" % (url, url))
admin.py:
list_display = ('full_url', ... )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With