Зависимый раскрывающийся цепочечный джанго-фильтр - PullRequest
0 голосов
/ 05 мая 2019

Как получить зависимые фильтры для двух полей?

models.py

class FinanceAccountDetail(models.Model):
    accountName = models.CharField(max_length=40)
    msdmName = models.CharField(max_length=80)
    deliveryManagedFrom = models.CharField(max_length=40)
    marketName = models.CharField(max_length=20)
    isActive = models.BooleanField(default=True)
    year = models.IntegerField ( default=2019 )
    sdu_id = models.IntegerField ( default=1)

    def __str__(self):
        return u'%s' % (self.accountName)

filters.py

class dashboard_filter(django_filters.FilterSet):
    deliveryManagedFrom = django_filters.ModelChoiceFilter(queryset=FinanceAccountDetail.objects.values_list('deliveryManagedFrom',flat=True).distinct())
    accountName = django_filters.ModelChoiceFilter(queryset=FinanceAccountDetail.objects.values_list('accountName',flat=True).distinct())

    class Meta:
        model = FinanceAccountDetail
        fields = ['accountName', 'deliveryManagedFrom']

Я хочу фильтровать и курицуиспользуйте этот фильтр для создания наборов запросов

views.py

def Dashboard(request , *args , **kwargs):

    q = {k: v for k , v in request.GET.items () if v}
    total_budget_usd_queryset = FinanceAccountDetail.objects.filter(**q).aggregate(budget=Sum(F('budget__january' ) + F ( 'budget__february' ) + F ( 'budget__march' ) + F ( 'budget__april' ) + F ( 'budget__may' ) + F ( 'budget__june' ) + F ('budget__july' ) + F ( 'budget__august' ) + F ( 'budget__september' ) + F ( 'budget__october' ) + F ( 'budget__november' ) + F ( 'budget__december' ) ) )
    total_usd_budget = total_budget_usd_queryset['budget']
    month_query = Hours.objects.values_list ( 'month' ).distinct ()
    month_final = [item for sublist in month_query for item in sublist]
    month = month_final[0]
    total_sek_budget = total_budget_usd_queryset['budget']
    total_actual_usd_queryset = FinanceAccountDetail.objects.filter(**q ).aggregate(actual=Sum (F ( 'budget__Carren_Jan_Cost' ) + F ( 'budget__Carren_Feb_Cost' ) + F ( 'budget__Carren_Mar_Cost' ) + F ( 'budget__Carren_Apr_Cost' ) + F ('budget__Carren_May_Cost' ) + F ( 'budget__Carren_Jun_Cost' ) + F ( 'budget__Carren_Jul_Cost' ) + F ( 'budget__Carren_Aug_Cost' ) + F ('budget__Carren_Sep_Cost' ) + F ( 'budget__Carren_Oct_Cost' ) + F ( 'budget__Carren_Nov_Cost' ) + F ( 'budget__Carren_Dec_Cost' ) ) )
    total_usd_actual = total_actual_usd_queryset['actual']
    total_budget_hours_queryset = FinanceAccountDetail.objects.filter(**q ).aggregate ( budget=Sum (F ('hours__january' ) + F ( 'hours__february' ) + F ( 'hours__march' ) + F ( 'hours__april' ) + F ( 'hours__may' ) + F ( 'hours__june' ) + F ('hours__july' ) + F ( 'hours__august' ) + F ( 'hours__september' ) + F ( 'hours__october' ) + F ( 'hours__november' ) + F ( 'hours__december' ) ) )
    total_hours_budget = total_budget_hours_queryset['budget']
    total_actual_hours_queryset = FinanceAccountDetail.objects.filter ( **q ).aggregate ( actual=Sum (F ('hours__CADO_Hour_Jan' ) + F ( 'hours__CADO_Hour_Feb' ) + F ( 'hours__CADO_Hour_Mar' ) + F ( 'hours__CADO_Hour_Apr' ) + F ('hours__CADO_Hour_May' ) + F ( 'hours__CADO_Hour_Jun' ) + F ( 'hours__CADO_Hour_Jul' ) + F ( 'hours__CADO_Hour_Aug' ) + F ('hours__CADO_Hour_Sep' ) + F ( 'hours__CADO_Hour_Oct' ) + F ( 'hours__CADO_Hour_Nov' ) + F ( 'hours__CADO_Hour_Dec' ) ) )
    total_hours_actual = total_actual_hours_queryset['actual']
    total_budget_usd_market_queryset = FinanceAccountDetail.objects.filter(**q).exclude(marketName='NA',marketName__exact='').values_list('marketName').distinct().annotate(budget=Sum(F('budget__january') + F('budget__february')+F('budget__march')+F('budget__april' ) + F ( 'budget__may' ) + F ( 'budget__june' ) + F ('budget__july' ) + F ( 'budget__august' ) + F ( 'budget__september' ) + F ( 'budget__october' ) + F ('budget__november')+F('budget__december' )))
    total_budget_usd_market_budget = [entry for entry in total_budget_usd_market_queryset]
    market = []
    budget =[]
    for i,j in total_budget_usd_market_budget:
        market.append(i)
        budget.append(j)

    a_zip = zip(market,budget)
    network_list = FinanceAccountDetail.objects.all ()
    network_filter = dashboard_filter( request.GET , request=request , queryset=network_list )
    return render ( request , 'finance_new/dashboard_summary.html' ,
                    {'filter': network_filter,'total_usd_budget':total_usd_budget,'total_usd_actual':total_usd_actual,
                    'total_hours_budget':total_hours_budget,'total_hours_actual':total_hours_actual,'total_sek_budget':total_sek_budget,
                     'a_zip':a_zip} )

HTML-код

{% extends 'finance_new/finance_base.html' %}

 {% load widget_tweaks %}
{% load humanize %}
 {% block body %}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
       <div class="main-body">
        <div class="page-wrapper">
            <div class="page-header">
                <div class="page-header-title">
                    <h4>Financial Dashboard</h4>
                </div>
                <div class="page-header-breadcrumb">
                    <ul class="breadcrumb-title">
                        <li class="breadcrumb-item">
                            <a href="/finance_new/financemonthlyIndex/">
                                <i class="icofont icofont-home"></i>
                            </a>
                        </li>
                        <li class="breadcrumb-item">Dasboard
                        </li>
                        <li class="breadcrumb-item">Financial Dashboard
                        </li>
                    </ul>
                </div>
            </div>
          <div class="container" style="max-width: 1298px";>
          <form method="get" novalidate>
                <div class="well" style="border-radius: 20px;border-color: black;/* margin-left: -42px; *//* background-color: cadetblue; */width: 100%;">
                    <div class="row" >
                        <div  class="form-group col-sm-4 col-md-3">
                            SDU
                            {% render_field filter.form.deliveryManagedFrom class="form-control" %}
                        </div>

                        <div  class="form-group col-sm-4 col-md-3">
                            Account Name
                            {% render_field filter.form.accountName class="form-control" %}
                        </div>
                       <button type="submit" class="btn btn-primary" style="margin: 19px;">
                        <span class="glyphicon glyphicon-search"></span> Search
                    </button>
                    </div>
                </div>
          </form>

Я застрял.Обратите внимание, я хочу сделать фильтр, а не форму.

...