Wagtail标签建议大小写不敏感设置失效问题排查
Wagtail标签大小写不敏感配置问题
已开启TAGGIT_CASE_INSENSITIVE = True,但在创建页面填写标签时,输入小写单词无法匹配下拉列表中对应的大小写标签,大小写仍被区分。
自定义标签模型代码
@register_snippet class BlogTag(TagBase): free_tagging = False name = models.CharField(max_length=25, unique=True) slug = models.SlugField(max_length=255, unique=True, blank=True) class Meta: verbose_name = "blog tag" verbose_name_plural = "blog tags" class TaggedBlog(ItemBase): tag = models.ForeignKey( BlogTag, related_name="tagged_blogs", on_delete=models.CASCADE ) content_object = ParentalKey( 'home.BlogPage', on_delete=models.CASCADE, related_name='tagged_items' )
BlogPage模型代码
class BlogPage(Page): tags = ClusterTaggableManager(through=TaggedBlog, blank=True) date = models.DateField("Мы это написали:") author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='blog_pages') body = StreamField([ ('heading', blocks.CharBlock(form_classname="title", label="Заголовок")), ('paragraph', blocks.RichTextBlock(label="Текст")), ('image', ImageChooserBlock(label="Изображение")), ('quote', blocks.BlockQuoteBlock(min_length='20', label="Цитата")), ('media', EmbedBlock(label="Ссылка на видео")), ], verbose_name='Содержимое') content_panels = Page.content_panels + [ FieldPanel('date'), FieldPanel('body'), FieldPanel('slug', permission='superuser'), FieldPanel('tags'), ] edit_handler = TabbedInterface([ ObjectList(content_panels, heading='Центр управления постами'), ObjectList(Page.promote_panels, heading='Promote', permission='superuser'), ]) def _get_unique_slug(self): slug = slugify(self.title) unique_slug = slug num = 1 while Page.objects.filter(slug=unique_slug).exists(): unique_slug = '{}-{}'.format(slug, num) num += 1 return unique_slug def save(self, *args, **kwargs): self.slug = self._get_unique_slug() super().save(*args, **kwargs)
问题原因
TAGGIT_CASE_INSENSITIVE = True仅对django-taggit的默认Tag模型生效,自定义的BlogTag继承自TagBase,不会自动应用该配置。同时Wagtail的标签选择器默认使用区分大小写的搜索逻辑,导致输入小写无法匹配已有大小写标签。
解决方案
1. 修改BlogTag模型,实现大小写不敏感搜索
重写snippet的自动完成搜索方法,同时在数据库层面设置大小写不敏感的唯一约束:
@register_snippet class BlogTag(TagBase): free_tagging = False # 根据数据库类型设置大小写不敏感的唯一约束,例如MySQL/PostgreSQL用utf8_general_ci name = models.CharField(max_length=25, unique=True, db_collation='utf8_general_ci') slug = models.SlugField(max_length=255, unique=True, blank=True) class Meta: verbose_name = "博客标签" verbose_name_plural = "博客标签" # 重写自动完成搜索方法,忽略大小写 @classmethod def autocomplete_search(cls, queryset, search_term): return queryset.filter(name__icontains=search_term) def save(self, *args, **kwargs): # 保存时统一标签名称为小写,避免重复创建不同大小写的标签 self.name = self.name.lower() # 自动生成slug(若未设置) if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs)
2. 确保标签选择器使用新的搜索逻辑
Wagtail的ClusterTaggableManager对应的FieldPanel会自动调用snippet的autocomplete_search方法,修改后即可实现输入小写时匹配对应标签。
内容的提问来源于stack exchange,提问作者denis.m
相关产品推荐
相关产品推荐

