django admin中选项字段的可搜索下拉列表

django admin中选项字段的可搜索下拉列表,django,django-models,django-forms,django-admin,django-autocomplete-light,Django,Django Models,Django Forms,Django Admin,Django Autocomplete Light,我有一个有很多数据的选择字段,我在管理面板上创建了下拉列表,但我想有一个可搜索的下拉列表 class ItemForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(PublicUserForm, self).__init__(*args, **kwargs) self.fields['city'] = forms.ChoiceField( choices = CHOOS

我有一个有很多数据的选择字段,我在管理面板上创建了下拉列表,但我想有一个可搜索的下拉列表

class ItemForm(forms.ModelForm):

   def __init__(self, *args, **kwargs):
       super(PublicUserForm, self).__init__(*args, **kwargs)
       self.fields['city'] = forms.ChoiceField(
       choices = CHOOSE_CITY) 

class ItemAdmin(admin.ModelAdmin):
   form = ItemForm

admin.site.register(Item, ItemAdmin)
我已经参考过了

提前谢谢

遵循以下步骤 使用pip安装django自动完成灯

pip install django-autocomplete-light
然后,在
Django.contrib.admin
grappelli
之前添加到
INSTALLED_APPS
,让Django找到我们需要的静态文件

'dal',
'dal_select2',
#'grappelli',
'django.contrib.admin',
现在,您需要创建一个自动完成视图,当您搜索时,该视图将以过滤的queryset响应

from dal import autocomplete

from your_app.models import City


class CityAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):

        if not self.request.user.is_authenticated():
            return City.objects.none()

        qs = City.objects.all()

        if self.q:
            qs = qs.filter(name__istartswith=self.q)

        return qs
注意:自动完成视图的基本视图应为
Select2QuerySetView

现在注册自动完成视图,为该视图创建一个

from your_app.views import CityAutocomplete

urlpatterns = [
    url(
        r'^city-autocomplete/$',
        CityAutocomplete.as_view(),
        name='city-autocomplete',
    ),
]
现在可以在项目表单中使用自动完成视图。使用
ModelSelect2
创建小部件

from dal import autocomplete

from django import forms


class ItemForm(forms.ModelForm):
    city = forms.ModelChoiceField(
        queryset=City.objects.all(),
        widget=autocomplete.ModelSelect2(url='city-autocomplete')
    )

    class Meta:
        model = Item
        fields = ('__all__')
现在,您可以轻松地在管理中使用它

from your_app.forms import ItemForm

class ItemAdmin(admin.ModelAdmin):
   form = ItemForm

admin.site.register(Item, ItemAdmin)
注意:如果在
项目
型号


如果城市是一个选择字段,您可以

使用
Select2ListView
和覆盖
get\u list
方法创建列表视图

class CityAutocomplete(autocomplete.Select2ListView):
    def get_list(self):
        # return all cities name here, it will be auto filtered by super class
        return ['Pune', 'Patna', 'Mumbai', 'Delhi', ...]
如上所述注册URL,现在修改模型表单并使用
select2listcoocefield

def get_choice_list():
    # all cites to used as chice list
    return ['Pune', 'Patna', 'Mumbai', 'Delhi', ...]


class ItemForm(forms.ModelForm):
    city = autocomplete.Select2ListChoiceField(
        choice_list=get_choice_list,
        widget=autocomplete.ListSelect2(url='city-autocomplete')
    )

    class Meta:
        model = Item
        fields = ('__all__')

正如我们在上面的示例中所做的那样,将此表单添加到ModelAdmin。

我必须使用
ChoiceField
而不是
ModelChoiceField
。我尝试了self.fields['slack\u channel']=forms.ChoiceField(choices=get\u my\u choices(),widget=autocomplete.Select2(url='choose\u channel'))但是我没有从管理员那里得到“q”如果
city
是项目模型中的一个字段,您可以在创建表单时使用
modelcoocefield
,也可以在小部件中使用
ModelSelect2
而不是
Select2