2013-09-16 83 views
2

我想使用django-autocomplete-light,但是我遇到了一些问题。 我想筛选ModelChoiceField中的查询集。 如果我不使用自动填写,我的结果选择是正确的,但如果我使用小部件它不能正常工作,它会显示所有记录。django-autocomplete-light filter queryset

这里是我的代码:

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 

回答

3

您应该设置MyModelAutocomplete.choices,无论是通过register()

autocomplete_light.register(MyModel, choices=MyModel.objects.filter(status=1)) 

或者类中:

class MyModelAutocomplete(autocomplete_light.AutocompleteModelBase): 
    choices = MyModel.objects.filter(status=1) 

参考文档的更多:

我想自动执行此操作,但小部件不太了解表单域实例。

2

通过定义

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主要用于动态filterming

2

我试图找出如何自动完成光文档中做到这一点的方法应用过滤器内部MyModelAutocomplete。我想出了如何,但不是没有一点挖掘,所以希望这是有帮助的。

在autocomplete_light_registry.py文件,填写“姓名”和“选择”参数:

#myapp/autocomplete_light_registry.py 
autocomplete_light.register(MyModel, 
    #... Other Parameters ... 
    name = 'SpecialMyModelAutocomplete', 
    choices = YourQuerySetHere, #e.g. MyModel.objects.filter(...) 
) 

的默认名称为“MyModelAutocomplete”所以,如果你有一个以上的注册自动完成的模型,你需要指定你想使用哪一个(否则它使用注册表中的第一个,而不是默认的)。

要指定,请使用(来自docs)的“autocomplete_names”“field_name:AutocompleteName的字典覆盖将用于字段的默认自动填充。”在我的情况下,我在django管理员中使用它。

#myapp/admin.py 
class MyModelAdminForm(autocompletelight.ModelForm): 
    class Meta: 
     model = MyModel 
     autocomplete_names = {'field_name':'SpecialMyModelAutocomplete'} 

请注意,您不需要包括要使用默认的自动完成功能在autocomplete_names任何领域。顺便提一句,“autocomplete_exclude”和“autocomplete_fields”在这里也很有意思,并且类似于ModelAdmin中的“字段”和“排除”,以指定使用自动完成包含/排除哪些字段。

增加: 您也可以在modelform_factory使用 “autocomplete_names”:

form = autocomplete_light.modelform_factory(MyOtherModel,autocomplete_names={MyFieldName:'MyModelAutocomplete'}) #where MyFieldName is a ForeignKey to MyModel 

从文档:

autocomplete_light.forms.modelform_factory(model,autocomplete_fields=None,autocomplete_exclude=None,autocomplete_names=None,registry=None,**kwargs) 
+0

感谢您给我们的贡献,它真的把我推到正确的方向。我已经使用了以下文档部分:[高级基础](https://django-autocomplete-light.readthedocs.org/en/docs_rewrite/cookbook.html#high-level-basics),[autocomplete_names](https ://django-autocomplete-light.readthedocs.org/en/latest/api.html?highlight = modelform_factory#autocomplete_light.forms.ModelForm.autocomplete_names)and [model_form_factory](http://django-autocomplete-light.readthedocs。组织/ EN /最新/ api.html?突显= modelform_factory#autocomplete_light.forms.modelform_factory) – raratiru