【问题标题】:Is it possible to forward processed (in views.py) form data for further use?是否可以转发已处理(在 views.py 中)的表单数据以供进一步使用?
【发布时间】:2019-10-22 12:22:54
【问题描述】:

我是 django 的新手,如果我不能足够清楚地表达自己,我很抱歉。首先:

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

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

我的第二个想法是,由于 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>

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

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

【问题讨论】:

    标签: django python-3.x django-views reportlab


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2012-08-30
      • 2023-03-19
      • 2019-06-10
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多