我有一个包含大量数据的选择字段,我已经在管理面板上创建了下拉列表,但是我想创建一个可搜索的下拉列表。
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)
我推荐了django-autocomplete-light。
谢谢!
答案 0 :(得分:2)
使用pip安装django自动完成灯
pip install django-autocomplete-light
然后,通过在INSTALLED_APPS
和django.contrib.admin
(如果存在)之前添加到grappelli
,让Django找到我们需要的静态文件
'dal',
'dal_select2',
#'grappelli',
'django.contrib.admin',
现在,您需要创建一个自动完成视图,该视图将在搜索时以过滤后的查询集响应。
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
。
现在注册自动完成视图。为此视图创建一个named url
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)
注意:如果您将
city
字段作为外键在Item
模型。
如果city
是“选择”字段,则可以use autocompleting based on a list of Strings
使用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', ...]
如上所述注册网址,现在修改您的模型表格并使用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__')
像上面的示例一样,将此表单添加到ModelAdmin。