Django-filter: CharFilter(widget=CSVWidget) tidak lagi berfungsi di 1.x

Dibuat pada 24 Mei 2017  ·  3Komentar  ·  Sumber: carltongibson/django-filter

Saya menggunakan CSVWidget dengan CharFilter dalam 1.x hari sebelumnya, tetapi saya memutakhirkan dan kombinasi itu tidak lagi berfungsi. Saya tidak dapat menemukan dokumen atau rekomendasi tentang apa yang harus dialihkan. Saya ingin menerima satu nilai atau beberapa nilai yang dipisahkan dengan koma

Komentar yang paling membantu

CSVWidget mengembalikan daftar nilai dengan benar, namun CharField.clean() memaksa daftar kembali menjadi nilai teks, karenanya "['1', '2', '3']" . Tidak cukup untuk meneruskan CSVWidget ke filter - bidang formulir perlu diganti untuk menerima daftar nilai.

Cara termudah untuk mendapatkan perilaku bidang yang benar adalah dengan mencampur BaseCSVFilter , karena ia membangun bidang formulir yang menerima daftar nilai dengan benar.

Semua 3 komentar

Cobalah sesuatu seperti:

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

Saya menghabiskan beberapa waktu untuk menghadapi masalah ini, dan saya pikir solusi

Saya mencoba melakukan sesuatu seperti:

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)

Menggunakan DRF & url dari: ?id__in=a,b,c

Namun sepertinya menggunakan widget=widgets.CSVWidget benar-benar membuat daftar sebagai string entah bagaimana?

Mencetak nilai filter menghasilkan "['a', 'b', 'c']"
actual_filter memiliki tanda kutip juga
Lookup(value="['a', 'b', 'c']", lookup_type='in')

Sesuai rekomendasi yang diberikan, saya beralih ke:

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

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

Dan kemudian saya bisa menggunakan ?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246

untuk mendapatkan hasil yang diharapkan.

Jenis hal "Daftar sebagai string" sepertinya bug atau setidaknya beberapa perubahan dokumen mungkin? Saya cukup tidak terbiasa dengan cara kerja fungsi yang mendasarinya. Mungkin itu hanya kesalahan penggunaan =)

CSVWidget mengembalikan daftar nilai dengan benar, namun CharField.clean() memaksa daftar kembali menjadi nilai teks, karenanya "['1', '2', '3']" . Tidak cukup untuk meneruskan CSVWidget ke filter - bidang formulir perlu diganti untuk menerima daftar nilai.

Cara termudah untuk mendapatkan perilaku bidang yang benar adalah dengan mencampur BaseCSVFilter , karena ia membangun bidang formulir yang menerima daftar nilai dengan benar.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat