是否可以转发处理过的(在 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']
我是 django 的新手,如果我不能足够清楚地表达自己的话,我深表歉意。开始于:
我构建了简单的表单来执行简单的计算,return 根据用户输入的结果。现在我想为用户添加一个选项来从这些结果生成 PDF,但我不确定我应该使用哪种方法。
我的第一个想法是将计算数据存储在某种全局变量中,并将其传递给负责生成 PDF 的视图。根据对
我的第二个想法是,由于 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']