Как я могу получить доступ к списку изменений администратора из просмотров? - PullRequest
0 голосов
/ 30 января 2019

Как я могу получить доступ к отфильтрованной таблице из представления?Я хочу экспортировать свою таблицу в xls, но она занимает всю таблицу, а не отфильтрованную.В admin.py я могу получить отфильтрованный набор запросов следующим образом:

response = super(ScheduleAdmin, self).changelist_view(request, extra_context)
    qs = response.context_data["cl"].queryset

Вот мой класс admin.py:

class StatsScheduleAdmin(ScheduleAdmin):
list_display = (
    'get_name',
    'code',
    'get_planned_hours',
    'get_done_hours',
    #'get_planned_cost_workers',
    'get_done_cost_workers',
    #'get_planned_cost',
    'get_avg_cost',
    #'get_planned_hour_cost',
    'get_avg_hour_cost',
    #'get_planned_score',
    'get_done_score'
)
search_fields = ('facility__name',)

def changelist_view(self, request: object, extra_context: object = None) -> object:
    request.GET = request.GET.copy()
    self.month = request.GET.get('month', None)
    self.year = request.GET.get('year', None)
    if self.month or self.year:
        self.date = datetime.date(int(self.year), int(self.month), 1)
    else:
        self.date = timezone.now()
        self.month = self.date.month
        self.year = self.date.year
    extra_context = extra_context or {}
    extra_context['next'] = self.next_date
    extra_context['prev'] = self.prev_date
    extra_context['date'] = self.date

    sum_done_score = 0
    sum_done_hours = 0
    sum_done_cost_workers = 0
    sum_schedule_income_value = 0

    response = super(ScheduleAdmin, self).changelist_view(request, extra_context)
    qs = response.context_data["cl"].queryset
    #qs = self.get_queryset(request)
    for q in qs.values('id'):
        schedules = Schedule.objects.filter(id = q['id'])
        for s in schedules:
            sum_done_score += s.get_value()
            sum_done_hours += s.get_done_hours()
            sum_done_cost_workers += s.get_done_cost_workers()
            sum_schedule_income_value += s.get_schedule_income_value()

    extra_context['sum_done_score'] = sep('%.2f zł' % sum_done_score, thou=".", dec=",")
    extra_context['sum_done_hours'] = sep('%.2f h' % sum_done_hours, thou=".", dec=",")
    extra_context['sum_done_cost_workers'] = sep('%.2f zł' % sum_done_cost_workers, thou=".", dec=",")
    extra_context['sum_schedule_income_value'] = sep('%.2f zł' % sum_schedule_income_value, thou=".", dec=",")

    return super(ScheduleAdmin, self).changelist_view(request, extra_context=extra_context)

и метод views.py:

def xls_schedule_stats(request, year, month):

def get_name(obj):
    return obj.facility.name

def code(obj):
    if obj.facility.cost_category:
        return obj.facility.cost_category.number
    return ''

def get_company(obj):
    if obj.facility.cost_category.owner_company:
        return obj.facility.cost_category.owner_company.name
    return 'Brak'

def get_done_hours(obj):
    return '%.2f h' % obj.get_done_hours()

def get_done_cost_workers(obj):
    return '%.2f zł' % obj.get_done_cost_workers()

def get_avg_cost(obj):
    return '%.2f zł' % obj.get_avg_cost()

def get_avg_hour_cost(obj):
    return '%.2f zł' % obj.get_avg_hour_cost()

def get_planned_score(schedule):
    return '%.2f zł' % schedule.get_value()

def get_done_score(schedule):
    return '%.2f zł' % schedule.get_value()

HEADERS = {
    'Obiekt': get_name,
    'Numer kontrolingowy': code,
    'Spółka': get_company,
    'Godziny wykonane': get_done_hours,
    'Koszty pracowników wykonane': get_done_cost_workers,
    'Wykonany średni koszt pracownika': get_avg_cost,
    'Wykonany średni koszt godziny': get_avg_hour_cost,
    'Wynik wykonany': get_done_score,
}

queryset = Schedule.objects.filter(date__month=month, date__year=year) # I want to access to the filtered list here

writer = XlsWriter(sheet_name='Obiekty {}-{}'.format(month, year))

for col, label in enumerate(HEADERS.keys()):
    writer.write(0, col, label)

for row, schedule in enumerate(queryset, 1):
    for col, field in enumerate(HEADERS.values()):
        writer.write(row, col, field(schedule))

response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=schedule_stats {}-{}.xls'.format(year, month)
writer.save(response)

return response
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...