django admin 中选择字段的可搜索下拉菜单

ish*_*rma 4 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 = CHOOSE_CITY) 

class ItemAdmin(admin.ModelAdmin):
   form = ItemForm

admin.site.register(Item, ItemAdmin)
Run Code Online (Sandbox Code Playgroud)

我已经推荐了django-autocomplete-light

提前致谢!

Sat*_*dra 5

按着这些次序

使用 pip 安装 django autocomplete light

pip install django-autocomplete-light
Run Code Online (Sandbox Code Playgroud)

然后,让 Django 找到我们需要的静态文件,方法是INSTALLED_APPS在 , beforedjango.contrib.admingrappelliif present 中添加

'dal',
'dal_select2',
#'grappelli',
'django.contrib.admin',
Run Code Online (Sandbox Code Playgroud)

现在您需要创建一个自动完成视图,该视图将在您搜索时使用过滤后的查询集进行响应。

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
Run Code Online (Sandbox Code Playgroud)

注意:自动完成视图的基础视图应该是Select2QuerySetView.

现在注册自动完成视图为视图创建一个命名 url

from your_app.views import CityAutocomplete

urlpatterns = [
    url(
        r'^city-autocomplete/$',
        CityAutocomplete.as_view(),
        name='city-autocomplete',
    ),
]
Run Code Online (Sandbox Code Playgroud)

您现在可以在项目表单中使用自动完成视图。用于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__')
Run Code Online (Sandbox Code Playgroud)

现在您可以在管理中轻松使用它。

from your_app.forms import ItemForm

class ItemAdmin(admin.ModelAdmin):
   form = ItemForm

admin.site.register(Item, ItemAdmin)
Run Code Online (Sandbox Code Playgroud)

注意:city如果您将字段作为模型中的外键, 这将起作用Item


如果city是选择字段,您可以使用基于字符串列表的自动完成功能

Select2ListView使用并覆盖get_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', ...]
Run Code Online (Sandbox Code Playgroud)

如上注册 URL,现在修改您的模型表单并使用Select2ListChoiceField

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__')
Run Code Online (Sandbox Code Playgroud)

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