2017-09-07 13 views
0

私は、ユーザーがテーブルに表示される情報を変更するために適用できるフィルタをいくつか持っています。Django適用フィルタDataTableを再読み込みする

 $.ajax({ 
      url: '/fund_monitor/fund_directory', 
      type: 'GET', 
      data:JSON.stringify({ 
       filter_dict: filter_dict 
      }), 
      success: function (data) { 
      } 
     }); 

非常にシンプルなもの:私は、ユーザーがこれらのフィルタのいずれかでクリックするたびにトリガされますAjax電話を持っています。次の私のClass Based ViewはこのAjax Callを提供します。私はテーブルに表示されるようにしたいすべてのidsを収集した後

def get(self, request, *args, **kwargs): 
    filtered_ids = [] 
    if request.is_ajax(): 
     #filter_dict = request.GET.getlist('filter_dict') 
     request_data = json.dumps(request.GET) 
     request_data = json.loads(request_data) 
     for each in request_data: 
      each = json.loads(each) # Just for parsing 
      for key, value in each['filter_dict'].items(): 
       if key == 'Structure': 
        objects = Fund.objects.filter(structure__in=value).values('fund_account_id').distinct() 
        for fund_account_id in objects: 
         filtered_ids.append(fund_account_id['fund_account_id']) 
       elif key == 'Fund Class': 
        objects = Fund.objects.filter(fund_class__in=value).values('fund_account_id').distinct() 
        for fund_account_id in objects: 
         filtered_ids.append(fund_account_id['fund_account_id']) 
       elif key == 'Designated Broker': 
        objects = Fund.objects.filter(designated_broker__in=value).values('fund_account_id').distinct() 
        for fund_account_id in objects: 
         filtered_ids.append(fund_account_id['fund_account_id']) 

     filtered_ids = set(filtered_ids) 
     context = self.get_context_data(filtered_ids, **kwargs) 
     self.template_name = 'fund_monitor/fundaccount_table_list.html' 
     return self.render_to_response(context) 
    context = self.get_context_data(**kwargs) 
    return self.render_to_response(context) 

だから、私はこれらすべてのidsを取り、idsに基づいて必要な情報を取得get_context_data関数に渡します。

def get_context_data(self, filtered_ids=None, **kwargs): 
    context = super(__class__, self).get_context_data(**kwargs) 
    context['nbar'] = 'fund_monitor' 
    context['sbar'] = 'fundaccount_list' 
    context['transmission'] = 3 

    if filtered_ids: 
     context['fundaccount_list'] = self.model.objects.filter(id__in=filtered_ids) 
    else: 
     context['fundaccount_list'] = self.model.objects.all() 
    url_dict = defaultdict(list) 
    for fund in context['fundaccount_list']: 
     end_date = str(NAV.objects.filter(fund= fund.id, transmission=3).values('valuation_period_end_date').order_by('-valuation_period_end_date')[0]['valuation_period_end_date']) 
     start_date = str(NAV.objects.filter(fund= fund.id, transmission=3).values('valuation_period_end_date').order_by('-valuation_period_end_date')[1]['valuation_period_end_date']) 

     url_dict[fund.account_description].extend([fund.id,context['transmission'], 
                start_date, end_date]) 
    context['obj_items'] = dict(url_dict) 
    return context 

それはget機能で、コンテキストを返した後ので、ライン:

self.template_name = 'fund_monitor/fundaccount_table_list.html' 
return self.render_to_response(context) 

が変更テンプレート名で実行する必要があります。このtemplate_nameには、基本的に表HTMLのみが含まれています。基本的には、テーブル全体を更新するのではなく、ページ全体を更新するだけです...しかし、contextはフィルタのために更新されていますが、テーブルはリロードされません。何か案は?

答えて

0

シンプルなソリューション:

$.ajax({ 
     url: '/fund_monitor/fund_directory', 
     type: 'GET', 
     data:JSON.stringify({ 
      filter_dict: filter_dict 
     }), 
     success: function (data) { 
      $("#myTable").html(data); // Add this line to your based on your table div 
     } 
    }); 
関連する問題