Django-filter: CharFilter(widget=CSVWidget) ne fonctionne plus dans 1.x

Créé le 24 mai 2017  ·  3Commentaires  ·  Source: carltongibson/django-filter

J'utilisais CSVWidget avec un CharFilter dans les jours antérieurs à 1.x, mais je mets à niveau et cette combinaison ne fonctionne plus. Je ne trouve pas de documents ou de recommandations sur quoi passer. Je veux accepter une seule valeur ou plusieurs valeurs séparées par des virgules

Commentaire le plus utile

CSVWidget renvoie correctement une liste de valeurs, mais CharField.clean() contraint la liste à revenir en une valeur de texte, d'où "['1', '2', '3']" . Il ne suffit pas de passer CSVWidget au filtre - le champ du formulaire doit être remplacé pour accepter une liste de valeurs.

Le moyen le plus simple d'obtenir le comportement de champ correct est de mélanger le BaseCSVFilter , car il construit correctement un champ de formulaire qui accepte une liste de valeurs.

Tous les 3 commentaires

Essayez quelque chose comme :

class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
     pass

J'ai moi-même passé du temps à rencontrer ce problème et je pense que la solution

J'essayais de faire quelque chose comme :

class TestListFilter(Filter):
    field_class = forms.CharField

    def filter(self, qs, value):
        actual_filter = fields.Lookup(value, 'in')
        from pprint import pprint
        pprint(value)
        pprint(actual_filter)
        return qs

class BaseModelFilter(filters.FilterSet):
    id__in = TestListFilter(name='id', lookup_expr='in', widget=widgets.CSVWidget)

Utilisation de DRF et d'une URL de : ?id__in=a,b,c

Cependant, il semble que l'utilisation de widget=widgets.CSVWidget convertisse réellement la liste en chaîne d'une manière ou d'une autre ?

L'impression de la valeur du filtre donne "['a', 'b', 'c']"
le actual_filter a aussi les guillemets
Lookup(value="['a', 'b', 'c']", lookup_type='in')

Selon la recommandation fournie, je change les choses en :

class UUIDInFilter(filters.BaseInFilter, filters.UUIDFilter):
    pass

class BaseModelFilter(filters.FilterSet):
    id = UUIDInFilter(name='id', lookup_expr='in')

Et puis j'ai pu utiliser ?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246

pour obtenir les résultats escomptés.

Le truc "Liste en tant que chaîne" ressemble à un bogue ou au moins à quelques modifications de la doc peut-être? Je ne connais pas du tout le fonctionnement de la fonctionnalité sous-jacente. Peut-être que c'est juste une erreur d'utilisation =)

CSVWidget renvoie correctement une liste de valeurs, mais CharField.clean() contraint la liste à revenir en une valeur de texte, d'où "['1', '2', '3']" . Il ne suffit pas de passer CSVWidget au filtre - le champ du formulaire doit être remplacé pour accepter une liste de valeurs.

Le moyen le plus simple d'obtenir le comportement de champ correct est de mélanger le BaseCSVFilter , car il construit correctement un champ de formulaire qui accepte une liste de valeurs.

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