rendere i tag case-insensitive con django-taggit
-
22-10-2019 - |
Domanda
Ho aggiunto i tag = TaggableManager (vuote = TRUE) per i miei modelli, ma voglio che i miei tag da maiuscole e minuscole. Ho visto alcuni frammenti di soluzioni per questo e volevo chiedere se c'è un modo semplice per farlo? Se devo sostituire alcuni metodi della TaggableManager, si prega di avvisare come posso farlo?
Grazie in anticipo, Arshavski Alexander.
Soluzione
questo frammento per un problema simile. Una copia del codice (ristampato per i posteri):
from django.db.models import Manager
from django.db.models.query import QuerySet
class CaseInsensitiveQuerySet(QuerySet):
def _filter_or_exclude(self, mapper, *args, **kwargs):
# 'name' is a field in your Model whose lookups you want case-insensitive by default
if 'name' in kwargs:
kwargs['name__iexact'] = kwargs['name']
del kwargs['name']
return super(CaseInsensitiveQuerySet, self)._filter_or_exclude(mapper, *args, **kwargs)
# custom manager that overrides the initial query set
class TagManager(Manager):
def get_query_set(self):
return CaseInsensitiveQuerySet(self.model)
# and the model itself
class Tag(models.Model):
name = models.CharField(maxlength=50, unique=True, db_index=True)
objects = TagManager()
def __str__(self):
return self.name
# now...
>>> tag = Tag(name='test')
>>> tag.save()
>>> Tag.objects.get(name='TEST')
<Tag: test>
In sostanza, si ignora il set di query iniziale, in modo che tutti i set di query prendono caso insensibilità in considerazione.
Altri suggerimenti
Sono sicuro che ho capito soluzione ormai :) Anche se mi metterò la risposta come qualcuno potrebbe colpire questo durante la ricerca -
https://github.com/shacker/django-taggit versione di django- taggit.
Permette di configurare TAGGIT_FORCE_LOWERCASE = True
Si consente inoltre di parole stop filtro.
Le versioni recenti di sostegno un'impostazione TAGGIT_CASE_INSENSITIVE
django-taggit, che dovrebbe comportarsi nel modo che stai descrivendo.