Генерация нескольких документов (модуль Python TempFile)

В настоящее время я пытаюсь распечатать финансовые отчеты с помощью моего веб-приложения - это должно происходить по нажатию кнопки. Однако, когда я нажимаю на кнопку, приложение печатает только 1 документ (первый). Я не понимаю, что это может быть, так как есть 2 разных возврата для каждого оператора if, которые перенаправляют на 2 разные страницы .HTML

Вот что я пробовал на данный момент:

import tempfile
def printReports(request , reports_pk):
    pkForm = get_object_or_404(SettingsClass , pk=reports_pk)

    complexName = pkForm.Complex
    if pkForm.Trial_balance_Monthly == True:
        ### Printing Trial Balance PDF
        response = HttpResponse(content_type= 'application/pdf')
        response['Content-Disposition']= 'attachment; filename=TrialBalance' + \
            str(datetime.now()) + '.pdf'
        response['Content-Transfer-Encoding'] = 'binary'

        content =  {"x_AlltrbYTD":x_AlltrbYTD , 'xCreditTotal':xCreditTotal , 'xDebitTotal':xDebitTotal , 'complexName':complexName , 'openingBalances': openingBalances ,'printZero':printZero , 'printDesc':printDesc , 'printAcc':printAcc}
        html_string=render_to_string('main/reports/trialBalanceYear.html' , content)
        html=HTML(string=html_string)

        result=html.write_pdf()

        with tempfile.NamedTemporaryFile(delete=True) as output:
            output.write(result)
            output.flush()

            output.seek(0)
            response.write(output.read())

            return response

    if pkForm.Trial_balance_Monthly == True:
       
        ### Printing Trial Balance PDF
        response = HttpResponse(content_type= 'application/pdf')
        response['Content-Disposition']= 'attachment; filename=TrialBalanceMonthly' + \
            str(datetime.now()) + '.pdf'
        response['Content-Transfer-Encoding'] = 'binary'

        content =  {"xtrbMonth":xtrbMonth , 'xCreditTotalM':xCreditTotalM , 'xDebitTotalM':xDebitTotalM , 'complexName':complexName , 'printZeroM':printZeroM}
        html_string=render_to_string('main/reports/trialBalanceMonthly.html' , content)
        html=HTML(string=html_string)

        result=html.write_pdf()

        with tempfile.NamedTemporaryFile(delete=True) as output:
            output.write(result)
            output.flush()

            output.seek(0)
            response.write(output.read())

    else:
        printTrialBalanceMonth = False

Программа печатает только то, что показывает первое if-выражение, и не печатает второй документ .pdf. Кто-нибудь знает, что может быть причиной этого?

Вы используете return в своем первом if блоке.

Django генерирует ответ, а код ниже return никогда не выполняется (кстати, он ничего не возвращает, так что у вас не будет ответа, даже если pkForm.Trial_balance_Monthly == True.

Современные IDE, такие как Pycharm, покажут вам цветное предупреждение здесь, но если вы не используете такую IDE, вы можете проследить, что происходит в вашем коде, используя отладчик.

Чтобы сделать такое взаимодействие, как вы описали (только одна кнопка и 2 отчета), вам нужно:

  1. Сделайте 2 разные конечные точки для 2 отчетов
  2. Напишите JS обработчик, который слушает нажатие кнопки и вызывает 2 конечные точки. Обрабатывайте ответ как обычно.

Альтернативный сценарий:

Сделайте временный zip-файл с двумя отчетами и создайте ответ только с одним zip-файлом. В каждой ОС есть функция разархивирования, так что ваш пользователь найдет это очень интуитивно понятным. Вот zip-файл документация

Вернуться на верх