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
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.
Commentaire le plus utile
CSVWidget
renvoie correctement une liste de valeurs, maisCharField.clean()
contraint la liste à revenir en une valeur de texte, d'où"['1', '2', '3']"
. Il ne suffit pas de passerCSVWidget
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.