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。
提前致谢!
使用 pip 安装 django autocomplete light
pip install django-autocomplete-light
Run Code Online (Sandbox Code Playgroud)
然后,让 Django 找到我们需要的静态文件,方法是INSTALLED_APPS在 , beforedjango.contrib.admin和grappelliif 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,就像我们在上面的示例中所做的那样。