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