django-filter with django autocomplete light

时间:2016-08-06 01:06:32

标签: django django-filter django-autocomplete-light

有没有人成功地将dal和django-filter一起使用? 以下尝试是我的, 我尝试使用filterset_factory,提供模型类和字段列表,然后我尝试使用futuremodelform。 我知道了,

ModelForm没有指定模型类。

我认为这只是众多错误中的一个。 以前任何人都这样做,我必须使用filterset_factory,并从参数创建动态类,我也想覆盖小部件,以便可以使用dal小部件。

   #testing filterset
    from dal import autocomplete
    from django.db import models
    class PanFilterSet(django_filters.FilterSet):
        filter_overrides = {
            models.ForeignKey: {
                'filter_class': autocomplete.ModelSelect2,
            },

        }

    def pan_filterset_factory(model,fields):
        meta = type(str('Meta'), (object,), {'model': model,'fields':fields,'form':autocomplete.FutureModelForm})
        filterset = type(str('%sFilterSet' % model._meta.object_name),
                         (PanFilterSet,), {'Meta': meta})
        return filterset

    searchFormFilterSet = pan_filterset_factory(self.model_class,self.final_search_fields)
    f = searchFormFilterSet(self.request.GET, queryset=self.get_queryset())
    print f.form.as_p()

1 个答案:

答案 0 :(得分:5)

我对DAL不是很熟悉,但是我对django-filter做出了贡献并对其内部结构有了一个很好的理解。几点说明:

  • filter_class中的filter_overrides应该是过滤器,而不是小部件。您可以通过extra键提供其他参数(例如小部件),如here所示。任何不属于过滤器的参数都会自动传递给基础表单字段。
  • 无论如何,使用覆盖并不是正确的方法,因为窗口小部件需要特定于字段的端点来执行自动完成。由于端点是特定于字段的,因此它不适用于所有ForeignKey
  • django-filter使用常规Form,而不是ModelForm s,因此不会构造适当的Meta内部类。 FutureModelForm无论如何似乎都无法提供自动填充功能 - 这似乎无关紧要?

您的工厂必须手动生成自动填充过滤器 - 如下所示:

def dal_field(field_name, url):
    return filters.ModelChoiceFilter(
        name=field_name,
        widget=autocomplete.ModelSelect2(url=url),
    )

def dal_filterset_factory(model, fields, dal_fields):
    attrs = {field: dal_field(field, url) for field, url in dal_fields.items()}
    attrs['Meta'] = type(str('Meta'), (object,), {'model': model,'fields': fields})

    filterset = type(str('%sFilterSet' % model._meta.object_name),
                     (FilterSet,), attrs)
    return filterset

# Usage:

# mapping of {field names: autocomplete endpoints}.
dal_fields = {'birth_country': 'country-autocomplete'}
fields = ['list', 'or', 'dict', 'of', 'other', 'fields']
SomeModelFilterSet = dal_filterset_factory(SomeModel, fields, dal_fields)

attrs中的字段使用声明性API。 docs

中的更多信息