Django-filter: CharFilter(widget = CSVWidget)は1.xでは機能しなくなりました

作成日 2017年05月24日  ·  3コメント  ·  ソース: carltongibson/django-filter

1.xより前の日にCharFilterでCSVWidgetを使用していましたが、アップグレードしているため、その組み合わせは機能しなくなりました。 何に切り替えるかについてのドキュメントや推奨事項が見つかりません。 カンマで区切られた単一の値または複数の値を受け入れたい

最も参考になるコメント

CSVWidgetは値のリストを正しく返しますが、 CharField.clean()はリストを強制的にテキスト値に戻すため、 "['1', '2', '3']"ます。 CSVWidgetをフィルターに渡すだけでは不十分です。値のリストを受け入れるには、フォームフィールドをオーバーライドする必要があります。

正しいフィールド動作を取得する最も簡単な方法は、値のリストを受け入れるフォームフィールドを適切に構築するため、 BaseCSVFilterをミックスインすることです。

全てのコメント3件

次のようなものを試してください:

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をミックスインすることです。

このページは役に立ちましたか?
0 / 5 - 0 評価