radiac / django-tagulous

Fabulous Tagging for Django
http://radiac.net/projects/django-tagulous/
Other
336 stars 66 forks source link

Allow user-defined display function in enhance #159

Open twang817 opened 2 years ago

twang817 commented 2 years ago

Allow user provided display function, so that we can do something like this:

from django.urls import reverse
from django.utils.html import format_html_join
from tagulous.constants import COMMA, DOUBLE_QUOTE, QUOTE, SPACE

def _my_create_display(field_name):
    def display(self, obj):
        field = getattr(obj, field_name)
        names = []
        for tag in field.tags:
            name = str(tag)
            name = name.replace(QUOTE, DOUBLE_QUOTE)
            if COMMA in name or SPACE in name:
                names.append("%s" % name)
            else:
                names.append(name)
        return format_html_join(
            ", ",
            '<a href="{}">{}</a>',
            (
                (reverse("admin:%s_%s_change" % (
                    field.model._meta.app_label,
                    field.tag_model.__name__.lower()
                ), args=(tag.id,)), name)
                for name, tag in zip(names, field.tags)
            )
        )
    display.short_description = field_name.replace("_", " ")
    return display

class MyModel(models.Model):
    tags = tagulous.models.TagField(blank=True)

class MyAdmin(tagulous.admin.TaggedModelAdmin):
    list_display = ['tags']
tagulous.admin.enhance(MyModel, MyAdmin, display_func=_my_create_display)
admin.site.register(MyModel, MyAdmin)

This produces a nice list of tags in the list_display, where each tag links to the change view of that specific tag in the admin:

image