覆盖django-taggit标记,使它们始终为小写

时间:2014-09-05 00:30:08

标签: python django django-taggit

我无法为模型中的多个标签找到一个好的答案或解决方案。我唯一发现的就是:

How can I limit django-taggit to accept only lowercase words?

这是我目前的代码:

from taggit.managers import TaggableManager
from taggit.models import TaggedItemBase


class TaggedStory(TaggedItemBase):
    content_object = models.ForeignKey("Story")


class TaggedSEO(TaggedItemBase):
    content_object = models.ForeignKey("Story")


class Story(models.Model):
    ...

    tags = TaggableManager(through=TaggedStory, blank=True, related_name='story_tags')

    ...

    seo_tags = TaggableManager(through=TaggedSEO, blank=True, related_name='seo_tags')

2 个答案:

答案 0 :(得分:1)

我通常在表单级别实现它:

def clean_tags(self):
    """
    Force all tags to lowercase.
    """
    tags = self.cleaned_data.get('tags', None)
    if tags:
        tags = [t.lower() for t in tags]

    return tags

这实际上取决于你如何看待它。我对解决方案感到满意,因为我认为这是一个验证问题。如果您认为这是一个数据完整性问题,我可以理解为什么您希望在模型级别执行此操作。此时,最好的办法是将taggit模块子类化为可以覆盖Tag.save()的点。

答案 1 :(得分:0)

在appname-> utils文件中,例如:(blog-> init .py),定义一个函数,如下所示:

def逗号分隔符(tag_string): “”“将每个标签转换为小写”“” 如果t.strip(),则返回[t.strip()。lower()for tag_string.split(',')中的t

然后,在settings.py文件中,将默认的taggit设置定义并覆盖为: TAGGIT_TAGS_FROM_STRING ='博客。 init .comma_splitter'