带有 django 自动完成灯的 django-filter
django-filter with django autocomplete light
有没有人一起成功使用 dal 和 django-filter?
下面的尝试是我的,
我尝试使用 filterset_factory,提供模型 class 和字段列表,然后我尝试使用 futuremodelform。
我得到了,
ModelForm 没有指定模型 class。
我认为这只是发生的众多错误之一。
以前有人这样做过,我必须使用 filterset_factory,并根据参数创建动态 classes,我还想覆盖小部件以便可以使用 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()
我对 DAL 不是很熟悉,但我为 django-filter 做出了贡献并且对其内部结构有一定的了解。一些注意事项:
- 您
filter_overrides
中的 filter_class
应该是 过滤器 ,而不是小部件。您可以通过 extra
键提供额外的参数(例如小部件),如 here 所示。任何不属于过滤器的参数都会自动传递给基础表单字段。
- 使用覆盖无论如何都不是正确的方法,因为小部件需要特定于字段的端点来执行自动完成。由于端点是特定于字段的,因此它不适用于所有
ForeignKey
s。
- django-filter 使用常规
Form
s,而不是 ModelForm
s,因此不会构造适当的 Meta
内部 class。 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.
中的更多信息
有没有人一起成功使用 dal 和 django-filter? 下面的尝试是我的, 我尝试使用 filterset_factory,提供模型 class 和字段列表,然后我尝试使用 futuremodelform。 我得到了,
ModelForm 没有指定模型 class。
我认为这只是发生的众多错误之一。 以前有人这样做过,我必须使用 filterset_factory,并根据参数创建动态 classes,我还想覆盖小部件以便可以使用 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()
我对 DAL 不是很熟悉,但我为 django-filter 做出了贡献并且对其内部结构有一定的了解。一些注意事项:
- 您
filter_overrides
中的filter_class
应该是 过滤器 ,而不是小部件。您可以通过extra
键提供额外的参数(例如小部件),如 here 所示。任何不属于过滤器的参数都会自动传递给基础表单字段。 - 使用覆盖无论如何都不是正确的方法,因为小部件需要特定于字段的端点来执行自动完成。由于端点是特定于字段的,因此它不适用于所有
ForeignKey
s。 - django-filter 使用常规
Form
s,而不是ModelForm
s,因此不会构造适当的Meta
内部 class。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.