业务需求
想在Django Admin后台显示彩色标签项,如下图:
那么究竟该如何实现上图所示的彩色标签呢?
解决方案
这里使用django-taggit来实现该功能,具体步骤如下:
- 安装django-taggit模块
pip install django-taggit - 配置settings.py
添加'taggit'到您的项目INSTALLED_APPS设置中INSTALLED_APPS = [ ...... , 'taggit' ]配置完成后,运行
python .\manage.py migrate使其生效。 - 在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='请输入标签,多个标签以空格或英文逗号分隔') ...... - 在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) - 实现效果如下图:


- 存在问题
通过方法设置的彩色标签不可以将其添加到list_editable字段中,该问题已提交到django-taggit的Issues中#759,后续会跟进该问题的解决方案并将其同步在此!
版权声明:本文为qq_34562959原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。