2013-03-10 5 views
3

У меня есть поле, как следующее:Как предварительно заполнить AutoModelSelect2Field со статическими данными? (Джанго-Выбор2 библиотека)

class ContactSelect(AutoModelSelect2Field): 
    queryset = Contact.objects.all() 
    search_fields = ['name__contains'] 
    to_field = 'name' 
    widget = AutoHeavySelect2Widget 

Он отлично работает, но загрузка начинается только после того, как я ввожу 2 письма, в то время как я хотел бы его включить наиболее подходящие варианты прямо в html и поиск по ним, когда пользователь вводит только 1 букву. Какой подход вы бы порекомендовали? Можно ли сделать это с помощью django-select2 (и, очевидно, select2), или я бы написал для этого свои собственные функции JS?

ответ

3

Возможное решение - разрешить пустой поиск, поэтому в списке появятся некоторые элементы, даже если в поле поиска ничего нет.

вид Джанго-Выбор2 всегда пропускает пустой термин в методе «получить», так что мы должны переопределить его:

class MySelect2ResponseView(AutoResponseView): 
    def get(self, request, *args, **kwargs): 
    term = request.GET.get('term') 
    if term == "": 
     return self.render_to_response(self._results_to_context(self.get_results(request, term, -1, None))) 
    return super(MySelect2ResponseView, self).get(request, *args, **kwargs) 

Теперь «» термин денется «get_results метод» вашего поля:

class ContactSelectWidget(AutoHeavySelect2Widget): 
    def __init__(self, *args, **kwargs): 
    kwargs['select2_options'] = { 
     # this will allow select2 to send empty search to server 
     'minimumInputLength': 0, 
     # it's needed, otherwise search field will be hided by select2 
     'minimumResultsForSearch': 0, 
    } 
    super(ContactSelectWidget, self).__init__(*args, **kwargs) 

class ContactSelect(AutoModelSelect2Field): 
    widget = ContactSelectWidget 
    queryset = Contact.objects.all() 
    search_fields = ['name__contains'] 
    to_field = 'name' 

    def get_results(self, request, term, page, context): 
    if term == "": 
     # return anything you want here: 
     return ('nil', False, [(1, "my_item1", {}), (2, "my_item2", {})]) 
    else: 
     return super(ContactSelect, self).get_results(request, term, page, context) 
Смежные вопросы