2

我正在尝试使用 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
4

3 回答 3

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)

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

我想自动执行此操作,但不幸的是,小部件不知道表单字段实例。

于 2013-09-29T19:48:44.217 回答
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多用于动态过滤

于 2014-12-17T09:51:01.027 回答
2

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

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

#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 管理员中使用它。

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

请注意,您不需要在 autocomplete_names 中包含任何要使用默认自动完成的字段。顺便说一句,“autocomplete_exclude”和“autocomplete_fields”在这里也可能很有趣,它们类似于 ModelAdmin 中的“fields”和“exclude”,以指定使用自动完成功能包含/排除哪些字段。

补充:还可以在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)
于 2015-02-05T23:00:23.440 回答