1.xより前の日にCharFilterでCSVWidgetを使用していましたが、アップグレードしているため、その組み合わせは機能しなくなりました。 何に切り替えるかについてのドキュメントや推奨事項が見つかりません。 カンマで区切られた単一の値または複数の値を受け入れたい
次のようなものを試してください:
class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
pass
私はこの問題にぶつかるのにしばらく時間を費やしましたが、
私は次のようなことをしようとしていました:
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)
DRFと次のURLを使用: ?id__in=a,b,c
しかし、 widget=widgets.CSVWidget
を使用すると、実際にはリストが文字列としてキャストされるように見えますか?
フィルタの値を出力すると、 "['a', 'b', 'c']"
actual_filterにも引用符がありますLookup(value="['a', 'b', 'c']", lookup_type='in')
提供された推奨事項に従って、私は物事を次のように切り替えます。
class UUIDInFilter(filters.BaseInFilter, filters.UUIDFilter):
pass
class BaseModelFilter(filters.FilterSet):
id = UUIDInFilter(name='id', lookup_expr='in')
そして、私は?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246
を使うことができました
期待される結果を得るために。
「文字列としてリストする」ということは、バグのように見えるのでしょうか、それとも少なくともいくつかのドキュメントの変更でしょうか。 ただし、基盤となる機能がどのように機能するかについては、かなりよくわかりません。 多分それは単にエラーを使用するだけです=)
CSVWidget
は値のリストを正しく返しますが、 CharField.clean()
はリストを強制的にテキスト値に戻すため、 "['1', '2', '3']"
ます。 CSVWidget
をフィルターに渡すだけでは不十分です。値のリストを受け入れるには、フォームフィールドをオーバーライドする必要があります。
正しいフィールド動作を取得する最も簡単な方法は、値のリストを受け入れるフォームフィールドを適切に構築するため、 BaseCSVFilter
をミックスインすることです。
最も参考になるコメント
CSVWidget
は値のリストを正しく返しますが、CharField.clean()
はリストを強制的にテキスト値に戻すため、"['1', '2', '3']"
ます。CSVWidget
をフィルターに渡すだけでは不十分です。値のリストを受け入れるには、フォームフィールドをオーバーライドする必要があります。正しいフィールド動作を取得する最も簡単な方法は、値のリストを受け入れるフォームフィールドを適切に構築するため、
BaseCSVFilter
をミックスインすることです。