2016-09-07 4 views
27

Я использую реализацию DataTables с помощью сервера с yadcf и select2 для добавления функциональности. Данные, используемые для заполнения таблицы, которая получена через запрос Ajax в представлении Django, а также данные для функции автозаполнения select2, но из отдельного представления Django.Значения select2 Select2 исчезают, когда поиск не возвращает результатов.

Моя проблема следующая. Если поисковый запрос не возвращает результаты, значения в полях поиска select2 исчезнут и не могут быть сброшены в DataTables - вместо этого вы должны обновить страницу. Значения в не-select2-полях остаются видимыми и могут быть сброшены.

Типы фильтров внутри проблемных столбцов: multi_select с выбранным типом select2. Типы фильтров в нестандартных колонках: range_date и range_date с использованием bootstrap-datetimepicker в качестве даты выборщика.

Ниже приведены параметры столбца select2.

{ 
"column_number": 3, 
"filter_type": "multi_select", 
"select_type": "select2", 
"select_type_options": { 
    dropdownCssClass : 'bigdrop', 
    multiple: true, 
    minimumInputLength: 1, 
    ajax: { 
     url: '{% url 'ffTestApp:searchData' 'product' %}', 
     delay: 250, 
     dataType: 'json', 
     data: function (params) { 
     return { 
      q: params.term, 
      v: yadcf.exGetColumnFilterVal(table,4), 
      s: yadcf.exGetColumnFilterVal(table,5) 
     }; 
     }, 
     processResults: function (data, params) { 
     params.page = params.page || 1; 
     return { 
      results: data.items 
     }; 
     }, 
    }, 
    escapeMarkup: function (markup) { return markup; }, 
    templateResult: function(data) { 
     return data.id; 
    }, 
    templateSelection: function(data) { 
     return data.id; 
    } 
    } 
} 

Ниже приведено мое представление Django, используемое для обеспечения функциональности автозаполнения.

def searchData(request, column): 
    try: 
     q = request.GET.getlist('q')[0] 
    except: 
     pass 
    else: 
     if q != "": 
      try: 
       products = request.GET.getlist('p[]') 
      except: 
       pass 
      else: 
       product_q = list() 
       for p in products: 
        product_q.append("p.name='{}'".format(p)) 
       if len(product_q)>0: 
        product_q = "({}) AND ".format(" OR ".join(product_q)) 
       else: 
        product_q = "" 

      try: 
       versions = request.GET.getlist('v[]') 
      except: 
       pass 
      else: 
       version_q = list() 
       for v in versions: 
        version_q.append("tp.version='{}'".format(v)) 
       if len(version_q)>0: 
        version_q = "({}) AND ".format(" OR ".join(version_q)) 
       else: 
        version_q = "" 

      try: 
       serials = request.GET.getlist('s[]') 
      except: 
       pass 
      else: 
       serial_q = list() 
       for v in serials: 
        serial_q.append("s.serial='{}'".format(v)) 
       if len(serial_q)>0: 
        serial_q = "({}) AND ".format(" OR ".join(serial_q)) 
       else: 
        serial_q = "" 

      autoComplete = connection.cursor() 
      if column == "product": 
       query = "SELECT DISTINCT p.name FROM ffTestApp.ffTestApp_product AS p INNER JOIN ffTestApp.ffTestApp_testprogram AS tp " \ 
        "ON tp.product_id=p.id INNER JOIN ffTestApp.ffTestApp_session AS s ON s.test_program_id = tp.id " \ 
        "WHERE {1}{2}p.name REGEXP '{0}' ORDER BY p.name ASC;".format(q, version_q, serial_q) 
      elif column == "version": 
       query = "SELECT DISTINCT tp.version FROM ffTestApp.ffTestApp_testprogram AS tp INNER JOIN ffTestApp.ffTestApp_session AS s " \ 
        "ON s.test_program_id=tp.id INNER JOIN ffTestApp_product AS p ON tp.product_id=p.id WHERE {1}{2}tp.version REGEXP '{0}'" \ 
        " ORDER by tp.version;".format(q, product_q, serial_q) 
      elif column == "serial": 
       query = "SELECT DISTINCT s.serial FROM ffTestApp.ffTestApp_session AS s INNER JOIN ffTestApp_testprogram AS tp ON s.test_program_id=tp.id" \ 
        " INNER JOIN ffTestApp_product AS p ON tp.product_id=p.id WHERE {1}{2}" \ 
        "s.serial REGEXP '{0}' ORDER BY s.serial;".format(q, product_q, version_q) 
      elif column == "status": 
       query = "SELECT DISTINCT final FROM ffTestApp.ffTestApp_session WHERE final REGEXP '{0}' ORDER BY final;".format(q) 

      autoComplete.execute(query) 
      m = [] 
      for i in autoComplete.fetchall(): 
       value = dict() 
       value["id"] = i 
       m.append(value) 
      results = {"items": m} 
    return JsonResponse(results, safe=False) 

спасибо.

+0

не может помочь без ссылки на тестовой странице, вы можете попытаться воспроизвести с помощью Ajax источника (из файла) и разместить его на любой детской площадке JS сайт – Daniel

+0

Эй Даниэль, похоже, эта ошибка также существует в одном из ваших примеров, связанных. Попробуйте следующее: Найдите «Некоторые данные 11» в столбце «Некоторые данные». Найдите «b_value» в столбце «Значения». Вы увидите, что параметр поиска в столбце Some Data исчезает. http://yadcf-showcase.appspot.com/cumulative_filtering.html –

+0

«b_value» (и другие, за исключением «a_value, e_value'), не должны присутствовать, потому что его режим' cumulative_filtering' ... будет почему это так ... – Daniel

ответ

1

добавить ниже код для выбор2:

$('select').select2({ 
    minimumResultsForSearch: -1 
}); 
Смежные вопросы