在Django Admin后台实现显示彩色标签项

业务需求

想在Django Admin后台显示彩色标签项,如下图:
示意图那么究竟该如何实现上图所示的彩色标签呢?

解决方案

这里使用django-taggit来实现该功能,具体步骤如下:

  1. 安装django-taggit模块
    pip install django-taggit
  2. 配置settings.py
    添加'taggit'到您的项目INSTALLED_APPS设置中
    INSTALLED_APPS = [
    	...... ,
        'taggit'
    ]
    

    配置完成后,运行python .\manage.py migrate使其生效。

  3. models.py中设计模型字段
    from django.db import modelsr
    from taggit.managers import TaggableManager
    
    
    class Media(models.Model):
    	media_tags = TaggableManager(blank=True, verbose_name='标签', help_text='请输入标签,多个标签以空格或英文逗号分隔')
    	......
    
  4. admin.py中设计显示效果
    import random
    
    from django.contrib import admin
    from django.utils.html import format_html
    
    from mms.models import Media
    
    class MediaAdmin(admin.ModelAdmin):
    	def get_queryset(self, request):
            return super().get_queryset(request).prefetch_related('media_tags')
    
    	def tag_list(self, obj):
            color = ['#0B5ED7', '#6C757D', '#198754', '#BB2D3B', '#FFCA2C', '#31D2F2', '#212529']
            return format_html(''.join(f'<span style="color: #fff; background-color: {random.choice(color)}; border-color: #dc3545; display: inline; padding: .375rem .25rem; margin-top: .25rem; margin-left: .25rem; margin-bottom: .25rem; font-size: 0.6rem; font-weight: 300; line-height: 0.6; text-align: center; vertical-align: middle; border: 1px solid transparent; border-radius: .25rem;">{o.name}</span>'for o in obj.media_tags.all()))
    	tag_list.allow_tags = True
    	tag_list.short_description = '标签'
    
    	list_display = ['tag_list']
    	search_fields = ['media_tags__name']
    
    admin.site.register(Media, MediaAdmin)
    
  5. 实现效果如下图:
    实现效果图1
    细节展示
  6. 存在问题
    通过方法设置的彩色标签不可以将其添加到list_editable字段中,该问题已提交到django-taggit的Issues中#759,后续会跟进该问题的解决方案并将其同步在此!

版权声明:本文为qq_34562959原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。