Django-filter: Filtre pour Django-Taggit (demande)

Créé le 16 août 2016  ·  11Commentaires  ·  Source: carltongibson/django-filter

En termes d'étoiles,

Que pensez-vous d'un filtre django-taggit ?

Le plus proche que j'ai à cela est:

tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        to_field_name='name',
        conjoined=True,
        distinct=True,
        queryset=Tag.objects.all(),
    )

Mais je ne peux pas le rendre insensible à la casse (un filtre pour la balise 'TeSt' devrait renvoyer des résultats avec la balise 'test').

Commentaire le plus utile

Exemple de travail avec les dernières bibliothèques :

from taggit.forms import TagField
from django_filters.views import FilterView

class TagFilter(django_filters.CharFilter):
    field_class = TagField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')
        super().__init__(*args, **kwargs)


class MyFilter(django_filters.FilterSet):
    tags = TagFilter(field_name='tags__name')

    class Meta:
        model = MyModel

Tous les 11 commentaires

En quoi le TaggitFilter serait-il différent d'un ModelMultipleChoiceFilter normal ?

De plus, je suis presque sûr que nous pourrions ajouter le support lookup_expr ici en joignant simplement le nom du champ à la recherche.

Avec ModelMultipleChoiceFilter l'URL doit être field_name=tag1&field_name=tag2 , mais il peut y avoir un nombre important de balises, ce qui rend l'URL très longue. Pas idéal pour une URL qui pourrait être partagée, par exemple.

Les balises sont traitées par django-taggit à l'aide d'un ensemble de règles , permettant de transmettre une seule chaîne contenant toutes les balises.

Quoi qu'il en soit, lookup_expr en ModelMultipleChoiceFilter serait certainement utile !

Un rapide coup d'œil indique que vous devriez pouvoir utiliser le TagsField Taggit. Cela vous donnerait leur comportement d'analyse csv.

class TagsFilter(CharFilter):
    field_class = taggit.forms.TagsField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')


class MyFilterSet(FilterSet):
    tags = TagsFilter(name='tags__name')

    class Meta:
        model = MyModel
GET http://localhost/api/my-model?tags=a,b,c,d

La mise en garde ici est que cela utilise une recherche in , qui n'est pas la solution insensible à la casse que vous recherchez.

Je suis plus ou moins dans l'esprit de ne pas ajouter de filtre spécifique pour Django Taggit, aussi génial soit-il.

En fin de compte, créer des filtres au niveau du projet n'est pas si difficile. Un aperçu décent ferait un long chemin. (Google est idéal pour ceux-là.)

Heureux de regarder une demande d'extraction A + si elle se présente, mais à part cela, je vais fermer cela car hors de portée.

OK très bien. Qu'en est-il du support pour lookup_expr dans ModelMultipleChoiceFilter ?

@stantond Heureux de regarder un PR. _Montrez-moi le Cödz_ 😀

J'aimerais pouvoir - malheureusement, je ne suis pas un développeur qualifié, mais un PM tâtonnant !

+1

Exemple de travail avec les dernières bibliothèques :

from taggit.forms import TagField
from django_filters.views import FilterView

class TagFilter(django_filters.CharFilter):
    field_class = TagField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')
        super().__init__(*args, **kwargs)


class MyFilter(django_filters.FilterSet):
    tags = TagFilter(field_name='tags__name')

    class Meta:
        model = MyModel

Utilisez le champ slug de la balise au lieu du champ name pour ne pas tenir compte de la casse. Taggit en minuscules les slugs par défaut.

Notez que nous pouvons étendre la solution dans https://github.com/carltongibson/django-filter/issues/460#issuecomment -507218839 avec un champ personnalisé si nous souhaitons prendre en charge le filtrage par une seule balise contenant un ou plusieurs espaces.

from django import forms
from django.utils.translation import gettext as _

from taggit.utils import parse_tags


class TagField(forms.CharField):

    def clean(self, value):
        value = super().clean(value)

        if "," not in value and '"' not in value and value:
            return [value]

        try:
            return parse_tags(value)
        except ValueError:
            raise forms.ValidationError(
                _("Please provide a comma-separated list of tags.")
            )

Le code est extrait de taggit/forms.py .

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Sonictherocketman picture Sonictherocketman  ·  3Commentaires

csarcom picture csarcom  ·  3Commentaires

GuillaumeCisco picture GuillaumeCisco  ·  3Commentaires

chromakey picture chromakey  ·  5Commentaires

edmorley picture edmorley  ·  3Commentaires