Django-filter: CharFilter (widget = CSVWidget) ya no funciona en 1.x

Creado en 24 may. 2017  ·  3Comentarios  ·  Fuente: carltongibson/django-filter

Estaba usando CSVWidget con un CharFilter en los días anteriores a 1.x, pero estoy actualizando y esa combinación ya no funciona. No encuentro documentos ni recomendaciones sobre a qué cambiar. Quiero aceptar un solo valor o varios valores separados por comas

Comentario más útil

CSVWidget devuelve correctamente una lista de valores, sin embargo CharField.clean() está forzando la lista de nuevo a un valor de texto, por lo tanto "['1', '2', '3']" . No es suficiente pasar CSVWidget al filtro; el campo del formulario debe anularse para aceptar una lista de valores.

La forma más fácil de obtener el comportamiento correcto del campo es mezclar BaseCSVFilter , ya que construye correctamente un campo de formulario que acepta una lista de valores.

Todos 3 comentarios

Prueba algo como:

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

Pasé algún tiempo encontrándome con este problema, y ​​creo que la solución de

Estaba intentando hacer algo como:

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)

Usando DRF y una URL de: ?id__in=a,b,c

Sin embargo, parece que usar widget=widgets.CSVWidget realidad arroja la lista como una cadena de alguna manera.

La impresión del valor del filtro da como resultado "['a', 'b', 'c']"
el actual_filter también tiene las comillas
Lookup(value="['a', 'b', 'c']", lookup_type='in')

Según la recomendación proporcionada, cambio las cosas a:

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

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

Y luego pude usar ?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246

para obtener los resultados esperados.

La cosa "Lista como cadena" parece un error o al menos algunos cambios en el documento, ¿tal vez? Sin embargo, no estoy familiarizado con cómo funciona la funcionalidad subyacente. Tal vez solo use error =)

CSVWidget devuelve correctamente una lista de valores, sin embargo CharField.clean() está forzando la lista de nuevo a un valor de texto, por lo tanto "['1', '2', '3']" . No es suficiente pasar CSVWidget al filtro; el campo del formulario debe anularse para aceptar una lista de valores.

La forma más fácil de obtener el comportamiento correcto del campo es mezclar BaseCSVFilter , ya que construye correctamente un campo de formulario que acepta una lista de valores.

¿Fue útil esta página
0 / 5 - 0 calificaciones