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
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.
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.