Передача данных из постформы в представление FileResponde

Недавно я начал использовать Django и мне удалось создать два представления, одно для отправки формы, а другое для возврата FileResponse, по отдельности они работают нормально.

Теперь мне нужно интегрировать оба варианта, когда клиент отправляет форму, я хочу перенаправить его на другой вид, используя поля, отправленные в предыдущей форме. Как я могу это сделать?

Вот вид моей формы:

def submitForm(request):
    
    if 'report' in request.POST:
        
        date_start = request.POST.get('date_start')
        date_end = request.POST.get('date_end')
        state = request.POST.get('state')
    
    return render(request, 'comissao.html')

Вот мое представление, которое создает файл pdf

def createPdf(request):

    date_start = '20220301'
    date_end = '20220331'
    state = 'G00471'
    
    body = "some html"
    options = { 'quiet': '' }
    pdfkit.from_string(body, options=options)

    file = open('file.pdf', 'rb')
    
    return FileResponse(file)

Как вы видите, мне нужна информация, переданная в первом представлении, для использования во втором представлении, я пробовал что-то вроде этого, но я думаю, что я ошибаюсь в концепции,

return reverse('pdf', kwargs={'state':state, 'date_start':date_start, 'date_end':date_end})

reverse() возвращает только URL, но я думаю, что вы скорее хотите сделать redirect() к этому представлению.

Для передачи параметров у вас есть несколько вариантов:

  • GET параметры
  • Сессия
  • URL параметры

Давайте использовать параметры GET, которые я бы предложил:

from urllib.parse import urlencode

...
def submitForm(request):
    ...
    response = redirect('pdf')
    params = { state' : state, 'date_start: date_start, 'date_end': date_end}
    response['Location'] += f'?{urlencode(params)}'
    return response

Затем в представлении PDF необходимо разобрать параметры GET:

def createPdf(request):
    date_start = request.GET.get("date_start")
    ...

Обратите внимание, что вам также может потребоваться преобразовать ваши даты в строку и обратно для запроса, что я здесь проигнорировал.

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