Выпадающий список с возможностью поиска для поля выбора в администраторе django

У меня есть поле выбора с большим количеством данных, я создал раскрывающийся список в панели администратора, но я хочу иметь раскрывающийся список с возможностью поиска.

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.

Заранее спасибо!


person ishita sharma    schedule 21.06.2018    source источник


Ответы (1)


Следуй этим шагам

Установите свет автозаполнения 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
comment
Я должен использовать ChoiceField, а не ModelChoiceField. Я пробовал self.fields['slack_channel'] = forms.ChoiceField(choices = get_my_choices(), widget=autocomplete.Select2(url='choose_channel') ), но я не получаю "q" от администратора - person ishita sharma; 21.06.2018
comment
если city является полем в вашей модели элемента, вы можете использовать ModelChoiceField при создании формы - person Satendra; 21.06.2018
comment
Также используйте ModelSelect2 вместо Select2 в виджете - person Satendra; 21.06.2018