我正在尝试使用django-autocomplete-light但我遇到了一些问题。
我想在ModelChoiceField
中过滤查询集。
如果我不使用自动完成,我的结果选择是正确的,但如果我使用小部件它不能正常工作,它会显示所有记录。
这是我的代码:
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
答案 0 :(得分: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)
更多信息请参阅文档:
register()
to pass class attributes:“此外,关键字参数将被设置为类属性。”choices_for_request()
可能会有用。我想自动执行此操作,但不幸的是,窗口小部件不知道表单字段实例。
答案 1 :(得分:2)
通过定义方法
在MyModelAutocomplete
内应用过滤器
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 :(得分:2)
我试图在autocomplete-light文档中弄清楚如何做到这一点。我想出了如何,但不是没有一点挖掘,所以希望这是有帮助的。
在autocomplete_light_registry.py文件中,填写" name"和"选择"参数:
#myapp/autocomplete_light_registry.py
autocomplete_light.register(MyModel,
#... Other Parameters ...
name = 'SpecialMyModelAutocomplete',
choices = YourQuerySetHere, #e.g. MyModel.objects.filter(...)
)
默认名称为" MyModelAutocomplete"因此,如果为模型包含多个已注册的自动完成,则需要指定要使用的自动完成(否则它将使用注册表中的第一个,而不是默认值)。
要指定,请使用" autocomplete_names"这是(来自文档)" field_name:autocompleteName的字典,用于覆盖将用于字段的默认自动完成。"在我的情况下,我在django admin中使用它。
#myapp/admin.py
class MyModelAdminForm(autocompletelight.ModelForm):
class Meta:
model = MyModel
autocomplete_names = {'field_name':'SpecialMyModelAutocomplete'}
请注意,您不需要在autocomplete_names中包含要使用默认自动填充功能的任何字段。顺便提一下" autocomplete_exclude"和" autocomplete_fields"也可能在这里感兴趣,并且类似于"字段"和"排除"在ModelAdmin中指定要使用自动完成包含/排除哪些字段。
增加: 您还可以使用" autocomplete_names"在modelform_factory中:
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)