2016-09-07 19 views
27

Tôi đang sử dụng triển khai serverside của DataTables với yadcf và select2 cho chức năng bổ sung. Dữ liệu được sử dụng để điền bảng được mua thông qua một yêu cầu Ajax vào chế độ xem Django, cũng như dữ liệu cho chức năng tự động hoàn thành select2, nhưng từ một chế độ xem Django riêng biệt.Chọn2 giá trị bộ lọc biến mất khi tìm kiếm không trả lại kết quả

Vấn đề của tôi là vấn đề sau. Nếu một truy vấn tìm kiếm, nó sẽ không trả lại kết quả, các giá trị trong các trường tìm kiếm select2 sẽ biến mất và không thể được đặt lại trong DataTables - thay vào đó bạn phải làm mới trang. Các giá trị trong trường không chọn 2 vẫn hiển thị và có thể được đặt lại.

Các loại bộ lọc trong các cột có vấn đề là multi_select với loại chọn là select2. Các loại bộ lọc trong các cột không có vấn đề là range_daterange_date bằng cách sử dụng bootstrap-datetimepicker làm loại trình ghi ngày tháng.

Dưới đây là các thông số cột select2 của tôi.

{ 
"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; 
    } 
    } 
} 

Dưới đây là chế độ xem Django của tôi được sử dụng để cung cấp chức năng tự động hoàn tất.

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) 

Cảm ơn bạn.

+0

không thể giúp mà không có một liên kết đến một trang thử nghiệm, bạn có thể thử để tái sử dụng nguồn ajax (từ tập tin) và lưu trữ nó trên bất kỳ trang web js sân chơi – Daniel

+0

Hey Daniel, có vẻ như lỗi này cũng tồn tại trong một trong các ví dụ của bạn, được liên kết. Hãy thử các cách sau: Tìm kiếm 'Một số dữ liệu 11' trong cột Một số dữ liệu. Tìm kiếm 'b_value' trong cột Giá trị. Bạn sẽ thấy thông số tìm kiếm trong cột Một số dữ liệu biến mất. http://yadcf-showcase.appspot.com/cumulative_filtering.html –

+0

'b_value' (và những người khác ngoại trừ' a_value, e_value') không nên có mặt vì chế độ 'cumulative_filtering' ... sẽ xem tại sao ... – Daniel

Trả lời

1

thêm bên dưới mã cho Select2:

$('select').select2({ 
    minimumResultsForSearch: -1 
}); 
Các vấn đề liên quan