是否可以转发处理过的(在 views.py 中)表单数据以供进一步使用?

Is it possible to forward processed (in views.py) form data for further use?

我是 django 的新手,如果我不能足够清楚地表达自己的话,我深表歉意。开始于:

我构建了简单的表单来执行简单的计算,return 根据用户输入的结果。现在我想为用户添加一个选项来从这些结果生成 PDF,但我不确定我应该使用哪种方法。

我的第一个想法是将计算数据存储在某种全局变量中,并将其传递给负责生成 PDF 的视图。根据对 的回答,应该有几种方法可以做到这一点(但我不确定它们是否合适,因为例如我的 url 永远不会改变)。

我的第二个想法是,由于 url 永远不会改变,也许数据仍在某处并且可以通过某种方式访问​​?我想说的是,我将计算结果以字典形式(在我的代码中命名为 context)传递给结果 html 模板。我还能访问这本词典并在另一个 views.py 函数中使用它吗?

有人可以提供一些见解或指导我应该搜索哪种文献(因为我不完全知道我应该采用哪种方法以及要寻找什么)。

我的 views.py 负责生成表单和显示结果的部分:

def PGP_skaiciuokle(request):

    if request.method == 'POST':

        form = PGPskaiciuokle(request.POST)

        pgpData = DuomenuData.objects.get(duomenys = "Lietuvos PGP").data.year
        valData = DuomenuData.objects.get(duomenys = "Valstybiu PGP").data.year

        if form.is_valid():          
            LtPGP = form.cleaned_data['Lietuvos_PGP']
            valstybe = form.cleaned_data['valstybe']
            pValKof = valstybe.pgp            
            iKastai = form.cleaned_data['kastai']

            result = iKastai * (LtPGP/pValKof)
            result = round(result, 2)

            context = {
                'LtPGP': LtPGP,
                'pVal': valstybe,
                'iKastai': iKastai,
                'result': result,
                'pgpData': pgpData,
                'valData': valData,
                }

            return render(request, 'PGPskaiciuokle_valid.html', context)
    else:
        form = PGPskaiciuokle()
        pgpData = DuomenuData.objects.get(duomenys = "Lietuvos PGP").data.year
        valData = DuomenuData.objects.get(duomenys = "Valstybiu PGP").data.year

    context = {
        'form': form,
        'pgpData': pgpData,
        'valData': valData,
    }
    return render(request, 'PGPskaiciuokle.html', context)

views.py 中生成 pdf 作为另一个函数的基本代码:

import io
from django.http import FileResponse
from reportlab.pdfgen import canvas     

def PGP_result(request):
        buffer = io.BytesIO()
        p = canvas.Canvas(buffer)
    #for now it just hello world, but collected results data should be somehow processed below
    #that a task to figure out after I will know how to collect that data
        p.drawString(100, 100, "hello world.")

        p.showPage()
        p.save()

        buffer.seek(0)
        return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

结果显示 html 模板的相关部分如下所示:

<div id='sk_body'>
        <fieldset class="rezultatai">
        <legend>Rezultatai</legend>
            <div>Lietuvos PGP: {{ LtPGP }} ({{ pgpData }} m. duomenys)</div>
            <div>Valstybė, kurios kaštai adaptuoti: {{ pVal }} ({{ valData }} m. duomenys)</div>
            <div>Adaptuoti kaštai, vietine valiuta: {{ iKastai }}</div>
            <div class="ats"><b>Rezultas: {{ result }} € </b></div>
        </fieldset>
    </div>
    <div id='sk_btt' style="text-align:center;">
        <form action='PGP_result' method='GET'>
            <button type='submit'>Generuoti PDF</button>
        </form>
    </div>

如果您需要更多信息或我不够清楚的地方,请告诉我。

我绝不要求为我编写代码,只是要求指出正确的方向文献,但是非常感谢示例代码。

几乎可以肯定你想为此使用 session

def PGP_skaiciuokle(request):
    ...
        if form.is_valid():
            ...
            request.session['form_data'] = conteext
            ...

def PGP_result(request):
    data = request.session['form_data']