Django-filter: CharFilter (القطعة = CSVWidget) لم يعد يعمل في 1.x

تم إنشاؤها على ٢٤ مايو ٢٠١٧  ·  3تعليقات  ·  مصدر: carltongibson/django-filter

كنت أستخدم CSVWidget مع CharFilter في الأيام السابقة لـ 1.x ، لكنني أقوم بالترقية ولم تعد هذه المجموعة تعمل. لا يمكنني العثور على أي مستندات أو توصيات حول ما يجب التبديل إليه. أرغب في قبول قيمة واحدة أو قيم متعددة مفصولة بفاصلات

التعليق الأكثر فائدة

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']"
يحتوي عامل التصفية الفعلي على الاقتباسات أيضًا
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 التقييمات

القضايا ذات الصلة

gsvr picture gsvr  ·  3تعليقات

sassanh picture sassanh  ·  4تعليقات

hakib picture hakib  ·  3تعليقات

xtrinch picture xtrinch  ·  4تعليقات

techdragon picture techdragon  ·  5تعليقات