كنت أستخدم CSVWidget مع CharFilter في الأيام السابقة لـ 1.x ، لكنني أقوم بالترقية ولم تعد هذه المجموعة تعمل. لا يمكنني العثور على أي مستندات أو توصيات حول ما يجب التبديل إليه. أرغب في قبول قيمة واحدة أو قيم متعددة مفصولة بفاصلات
جرب شيئًا مثل:
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']"
يحتوي عامل التصفية الفعلي على الاقتباسات أيضًا
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
، حيث إنها تُنشئ بشكل صحيح حقل نموذج يقبل قائمة من القيم.