Следуй этим шагам
Установите свет автозаполнения django с помощью pip
pip install django-autocomplete-light
Затем, чтобы позволить Django найти нужные нам статические файлы, добавив к INSTALLED_APPS
перед django.contrib.admin
и grappelli
, если они есть
'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', ...]
Зарегистрируйте 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__')
Добавьте эту форму в ModelAdmin, как мы сделали в примере выше.
person
Satendra
schedule
21.06.2018