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
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.
Komentar yang paling membantu
CSVWidget
mengembalikan daftar nilai dengan benar, namunCharField.clean()
memaksa daftar kembali menjadi nilai teks, karenanya"['1', '2', '3']"
. Tidak cukup untuk meneruskanCSVWidget
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.