首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-autocomplete-light filter查询集

django-autocomplete-light filter查询集
EN

Stack Overflow用户
提问于 2013-09-16 20:40:23
回答 3查看 2.7K关注 0票数 2

我正在尝试使用django-autocomplete-light,但我遇到了一些问题。我想过滤ModelChoiceField中的查询集。如果我不使用自动完成,我的结果选择是正确的,但如果我使用小部件,它就不能正常工作,它会显示所有记录。

下面是我的代码:

代码语言:javascript
复制
class MyModelAdminForm(forms.ModelForm):
    def __init__(self, *args, **kw):
        super(MyModelAdminForm, self).__init__(*args, **kw)
        self.fields['my_field'] = forms.ModelChoiceField(
            MyModel.objects.filter(status=1),
            widget=autocomplete_light.ChoiceWidget('MyModelAutocomplete')
    )

class MyModelAdmin(ModelAdmin):
    form = MyModelAdminForm
EN

回答 3

Stack Overflow用户

发布于 2013-09-30 03:48:44

您应该通过register()设置MyModelAutocomplete.choices

代码语言:javascript
复制
autocomplete_light.register(MyModel, choices=MyModel.objects.filter(status=1))

或者在类中:

代码语言:javascript
复制
class MyModelAutocomplete(autocomplete_light.AutocompleteModelBase):
    choices = MyModel.objects.filter(status=1)

有关更多信息,请参阅文档:

  • AutocompleteModel API docs
  • Using register() to pass class attributes:“此外,如果需要根据用户过滤选项,关键字参数将被设置为类attributes."
  • Overriding choices_for_request()可能会很有用。

我想自动化这一点,但不幸的是,小部件不知道表单域实例。

票数 3
EN

Stack Overflow用户

发布于 2014-12-17 17:51:01

通过定义一个方法在MyModelAutocomplete中应用过滤器

代码语言:javascript
复制
class MyModelAutocomplete(autocomplete_light.AutocompleteModelBase):
     choices=MyModel.objects.all()
     def choices_for_request(self):
        choices = choices.filter(status=1)
        return self.order_choices(choices)[0:self.limit_choices]  

choices_for_request主要用于动态过滤

票数 2
EN

Stack Overflow用户

发布于 2015-02-06 07:00:23

我试图弄清楚如何在autocomplete-light文档中做到这一点。我想出了方法,但不是没有一点挖掘,所以希望这是有帮助的。

在autocomplete_light_registry.py文件中,填写"name“和"choices”参数:

代码语言:javascript
复制
#myapp/autocomplete_light_registry.py
autocomplete_light.register(MyModel,
    #... Other Parameters ...
    name = 'SpecialMyModelAutocomplete',
    choices = YourQuerySetHere, #e.g. MyModel.objects.filter(...)
)

默认名称是"MyModelAutocomplete“,因此如果您为一个模型包含多个已注册的自动完成,则需要指定要使用的名称(否则,它将使用注册表中的第一个名称,而不是默认名称)。

要进行指定,请使用"autocomplete_names“,它(来自文档)是"A dict of field_name: AutocompleteName,以覆盖将用于字段的默认自动完成”。在我的例子中,我在django管理员中使用它。

代码语言:javascript
复制
#myapp/admin.py
class MyModelAdminForm(autocompletelight.ModelForm):
    class Meta:
        model = MyModel
        autocomplete_names = {'field_name':'SpecialMyModelAutocomplete'}

请注意,您不需要包括任何要在autocomplete_names中使用默认自动完成的字段。顺便说一句,"autocomplete_exclude“和"autocomplete_fields”在这里也可能是感兴趣的,并且类似于ModelAdmin中的“autocomplete_exclude”和"exclude“,以指定使用自动补全包括/排除哪些字段。

另外:您也可以在modelform_factory中使用"autocomplete_names“:

代码语言:javascript
复制
form = autocomplete_light.modelform_factory(MyOtherModel,autocomplete_names={MyFieldName:'MyModelAutocomplete'}) #where MyFieldName is a ForeignKey to MyModel

从文档中:

代码语言:javascript
复制
autocomplete_light.forms.modelform_factory(model,autocomplete_fields=None,autocomplete_exclude=None,autocomplete_names=None,registry=None,**kwargs)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18828337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档