Django-filter: CharFilter(widget=CSVWidget) funktioniert nicht mehr in 1.x

Erstellt am 24. Mai 2017  ·  3Kommentare  ·  Quelle: carltongibson/django-filter

Ich habe CSVWidget mit einem CharFilter in den Tagen vor 1.x verwendet, aber ich aktualisiere und diese Kombination funktioniert nicht mehr. Ich kann keine Dokumente oder Empfehlungen finden, zu was ich wechseln soll. Ich möchte einen einzelnen Wert oder mehrere durch Kommas getrennte Werte akzeptieren

Hilfreichster Kommentar

CSVWidget gibt eine Liste von Werten korrekt zurück, CharField.clean() zwingt die Liste jedoch zurück in einen Textwert, daher "['1', '2', '3']" . Es reicht nicht aus, CSVWidget an den Filter zu übergeben - das Formularfeld muss überschrieben werden, um eine Liste von Werten zu akzeptieren.

Der einfachste Weg, um das richtige Feldverhalten zu erhalten, besteht darin, BaseCSVFilter einzumischen, da es ein Formularfeld korrekt erstellt, das eine Liste von Werten akzeptiert.

Alle 3 Kommentare

Versuchen Sie etwas wie:

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

Ich habe einige Zeit damit verbracht, auf dieses Problem zu stoßen , und ich denke, @carltongibson hilft mir definitiv bei einigen Problemen.

Ich habe versucht, so etwas zu tun:

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)

Verwenden von DRF und einer URL von: ?id__in=a,b,c

Es scheint jedoch, als ob die Verwendung von widget=widgets.CSVWidget die Liste tatsächlich irgendwie in eine Zeichenfolge umwandelt?

Das Drucken des Filterwerts ergibt "['a', 'b', 'c']"
der aktuelle_filter hat auch die Anführungszeichen
Lookup(value="['a', 'b', 'c']", lookup_type='in')

Gemäß der empfohlenen Empfehlung ändere ich die Dinge auf:

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

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

Und dann konnte ich ?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246

um die erwarteten Ergebnisse zu erzielen.

Die Sache "Als String auflisten" scheint ein Fehler zu sein oder zumindest einige Änderungen am Dokument? Ich bin jedoch ziemlich unbekannt mit der Funktionsweise der zugrunde liegenden Funktionalität. Vielleicht ist es nur ein Verwendungsfehler =)

CSVWidget gibt eine Liste von Werten korrekt zurück, CharField.clean() zwingt die Liste jedoch zurück in einen Textwert, daher "['1', '2', '3']" . Es reicht nicht aus, CSVWidget an den Filter zu übergeben - das Formularfeld muss überschrieben werden, um eine Liste von Werten zu akzeptieren.

Der einfachste Weg, um das richtige Feldverhalten zu erhalten, besteht darin, BaseCSVFilter einzumischen, da es ein Formularfeld korrekt erstellt, das eine Liste von Werten akzeptiert.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen