django - django admin 中选择字段的可搜索下拉菜单
问题描述
我有一个包含大量数据的选择字段,我在管理面板中创建了下拉菜单,但我想要一个可搜索的下拉菜单。
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。
提前致谢!
解决方案
按着这些次序
使用 pip 安装 django 自动完成灯
pip install django-autocomplete-light
然后,让 Django 找到我们需要的静态文件,方法是添加INSTALLED_APPS
, beforedjango.contrib.admin
和grappelli
if present
'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
.
现在注册自动完成视图为视图创建一个命名的 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
是一个选项字段,您可以使用基于字符串列表的自动完成
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。
推荐阅读
- jvm - Tomcat7 - 创建 jvm 失败 Windows 10
- javascript - 如何在点击时执行多个承诺
- python - Scikit-image:如何忽略/屏蔽 ndarray 中的零值以便之后进行插值?
- r - 如何使用循环从矩阵中获取多个条件的多组子集?
- azure - Set 命令不适用于 Azure Kubernetes 群集中的部署更新
- css - 在 html 元素上创建带有悬停效果的平滑动画,以将其转换为文本
- algorithm - 如何合并两个自动机?
- java - Java 应用程序代理连接被拒绝
- dart - 引发了另一个异常:未找到材料小部件
- javascript - 有没有办法在 react-dnd 中为可拖动和可放置的项目添加标签